蛇形填数
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
-
输入
- 直接输入方陈的维数,即n的值。(n<=100) 输出
- 输出结果是蛇形方陈。 样例输入
-
3
样例输出
-
7 8 1 6 9 2 5 4 3
-
//错误代码:
-
#include<iostream> using namespace std; int main(){ int A[101][101]={0}; int n; cin>>n; int i=0,j=n,num=1; while(num<=n*n){ while(i<n){ //这里存在逻辑错误,当第二圈的时候回出现无限的死循环。因为第二圈的时候i<n恒成立
-
if(A[i+1][j]==0){ //应该将if语句里的判断条件一起形成循环条件。 A[++i][j]=num++; } } while(j>1){ if(A[i][j-1]==0){ A[i][--j]=num++; } } while(i>1){ if(A[i-1][j]==0){ A[--i][j]=num++; } } while(j<n){ if(A[i][j+1]==0){ A[i][++j]=num++; } } } for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ cout<<A[i][j]<<" "; } cout<<endl; } return 0; }
-
-
正确代码:
-
#include<iostream> using namespace std; int main(){ int data[100][100]={0}; int n; cin>>n; int x=0 , y = n-1 , cnt = 1; data[x][y] = cnt; while(cnt < n*n) { //向下走 while(x+1<n && !data[x+1][y]) { data[++x][y] = ++cnt; } //向左走 while(y-1>=0 && !data[x][y-1]) { data[x][--y] = ++cnt; } //向上走 while(x-1 >=0 && !data[x-1][y]) { data[--x][y] = ++cnt; } //向右走 while(y+1 <n && !data[x][y+1]) { data[x][++y] = ++cnt; } } for(int i=0; i<n; ++i) { for(int j=0; j<n; ++j) { cout << data[i][j] << " "; } cout << endl; } return 0; }