首页 > 代码库 > 1021. 从前有座山——java

1021. 从前有座山——java

1021. 从前有座山

Description

从前有座山,山的俯视图是一个n×n的矩形,(1,1)位置海拔最低为1,然后海拔沿环形依次升高。

给定n的值,输出这座山的海拔高度图。

Input Format

输入仅有一行,为一个正整数n

Output Format

输出为这座山的海拔高度图。

Sample Input

4

Sample Output

     1     2     3     4    12    13    14     5    11    16    15     6    10     9     8     7

Hint

首先程序#include <iomanip>

假设要输出a,将cout << a改成cout << setw(6) << a

Limits

对于20%的数据,N<10

对于100%的数据,N<150

面对这道题,我只能说,真心烦、、、、、代码注释的让我都不能忍了,真的都是有规律的重复代码,好烦,正在思考是不是可以省略下代码

import java.util.Scanner;public class Main {	private static Scanner in;	public static void main(String[]args){		in = new Scanner(System.in);		int n=in.nextInt();		int f[][] = new int[n][n];		boolean flag=false;// 当标志为false时就行赋值		boolean rflag=false;//当行标志为false时就由左到右赋值		boolean cflag=false;//当列标志为false时就由上到下赋值		int count=1;		int r=0;//表示第r行		int c=0;//表示第c列		boolean isbreak=false;//判断是否break过,这都是为了外围第一圈		while(true){			if(!flag){//标志非真,进行行赋值				if(!rflag){//行标识为假,从左到右赋值					for(int j=c;j<n;j++){						if(f[r][c]==0){//只对非0元素赋值							f[r][c]=count;							count++;							c++;						}else{							isbreak=true;							r++;//由这一行跳到下一行							flag=true;//行赋值过后应该列赋值							rflag=true;//行从左到右后,从右到左							break;						}					}					c--;//因为多加了一,这要减一					if(!isbreak){						isbreak=false;						r++;						flag=true;//行赋值过后应该列赋值						rflag=true;//行从左到右后,从右到左					}				}else{//行标识为真,从右到左赋值					for(int j=c;j>=0;j--){						if(f[r][c]==0){//只对非0元素赋值							f[r][c]=count;							count++;							c--;						}else{							r--;//由这一行跳到上一行							flag=true;//行赋值过后应该列赋值							rflag=false;//行从左到右后,从右到左							isbreak=true;							break;						}					}					c++;//因为多减了一,这要加一									if(!isbreak){						isbreak=false;						r--;						flag=true;//行赋值过后应该列赋值						rflag=false;//行从左到右后,从右到左					}				}			}else{//标志为真,进列赋值				if(!cflag){//列标志为false时就由上到下赋值					for(int i=r;i<n;i++){						if(f[r][c]==0){//只对非0元素赋值							f[r][c] =count;							count++;							r++;						}else{							c--;							flag=false;//列赋值过后应该行赋值							cflag=true;//由上到下赋值,变为由下到上							isbreak=true;							break;						}					}					if(!isbreak){						isbreak=false;						c--;						flag=false;//列赋值过后应该行赋值						cflag=true;//由上到下赋值,变为由下到上					}					r--;//因为多加了一,这要减一				}else{//列标志为true时就由下到上赋值					for(int i=r;i>=0;i--){						if(f[r][c]==0){							f[r][c]=count;							count++;							r--;						}else{							c++;//由这一列跳到下一列							flag=false;//列赋值过后应该行赋值							cflag=false;//由下到上赋值,变为由上到下							isbreak=true;							break;						}					}					r++;//因为多减了一,这要加一							if(!isbreak){						isbreak=false;						c++;						flag=false;//列赋值过后应该行赋值						cflag=false;//由下到上赋值,变为由上到下					}				}			}			if(count>n*n){//循环终止条件				break;			}		}			//输出			for(int i=0;i<n;i++){				for(int j=0;j<n;j++){					System.out.print("  "+f[i][j]+"  ");				}				System.out.println();			}			}	}