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(); } } }