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