zoukankan      html  css  js  c++  java
  • 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();
    			}
    		
    	}
    	
    }
    

      

  • 相关阅读:
    [梦]2005.2.10
    日语广播总汇
    数词与量词
    切忌望文生义的日文汉字
    特別な読み方の漢字
    日本语能力考简介
    一天三练
    兴趣记忆法(1)顺口溜记忆
    兴趣记忆(3)谚语
    兴趣记忆(2)学歌
  • 原文地址:https://www.cnblogs.com/969059506-java/p/3812518.html
Copyright © 2011-2022 走看看