1021. 从前有座山——java

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

  

原文地址:https://www.cnblogs.com/969059506-java/p/3812518.html