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

假设要输出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

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

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

for(int j=0;j

System.out.print(" "+f[i][j]+" ");

}

System.out.println();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值