蓝桥杯历年试题【打印十字图】

  • 本来这题我以为是找规律,一直想
  1. 确定行列数与n的关系  行:2*2*n+5 列:2*2*n+5
  2. 确定每行里$和.的关系
  3. 根据图像是个中心对称图形,只要找出四分之一的规律,其他可推导出来
  • 后来我才发现我天真了,然后想用类似广搜的做法,让$和.一层一层包围起来,这种做法让思路变得更简单,实现起来也更便捷
import java.util.Scanner;
public class Main {
	static int [][]next={{0,1},{1,0},{0,-1},{-1,0},{-1,1},{1,-1},{1,1},{-1,-1}};
	public static void main(String []args){
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int max=4*n+5;
		char [][]image=new char[max][max];
		for(int i=max/2-2;i<=max/2+2;i++){
			for(int j=max/2-2;j<=max/2+2;j++){
				if(j==max/2)
					image[i][j]='$';
				if(i==max/2)
					image[i][j]='$';
			}
		}
		for(int i=0;i<n;i++){
			getpoint(max,image);
			getdollar(max,image);
		}
		for(int i=0;i<max;i++){
			for(int j=0;j<max;j++){
				if(image[i][j]!='$'&&image[i][j]!='.')
					image[i][j]='.';
				System.out.print(image[i][j]);
			}
			System.out.println();
		}
	}
	public static void getpoint(int max,char[][] image){
		for(int i=0;i<max;i++){
			for(int j=0;j<max;j++){
				if(image[i][j]=='$'){
					for(int k=0;k<8;k++){
						int tx=i+next[k][0];
						int ty=j+next[k][1];
						if(image[tx][ty]!='$'){
							image[tx][ty]='.';
						}
					}
				}
			}
		}
	}
	public static void getdollar(int max,char[][] image){
		for(int i=0;i<max;i++){
			for(int j=0;j<max;j++){
				if(image[i][j]=='.'){
					for(int k=0;k<8;k++){
						int tx=i+next[k][0];
						int ty=j+next[k][1];
						if(image[tx][ty]!='.'){
							image[tx][ty]='$';
						}
					}
				}
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weatarse/article/details/81199663