标签:return 代码 setw str style iostream namespace 注意 ccf
题目 在n*n方阵里放入1,2,3,4.。。。。。。。。。。。。,n*n,要求填成蛇形。
例如n=4时方阵为
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
解析
如图
在第一行里
行数不变,列数依次加一,即第一行数为(1,1)(1,2)(1,3)........(1,n)
在第一行排列完以后,到第n列,在进行竖着排
即列数不变,行数依次加一,即第一行数为(n,1)(n,2)(n,3)........(n,n)
竖着排,排列完以后,到第n行,在进行横着倒着排
即行数不变,列数依次减一,即第n行数为(n,n)(n,n-1)(n,n-2)........(n,1)
排列完以后,到第1列,在进行竖着倒着排
即列数不变,行数依次加一,即第一行数为(1,n)(1,n-1)(1,n-2)........(1,2)
再往后是一直重复这个循环
但需注意的是 每进行完一次这个循环以后每一排和每一列都要向内缩进两个
即在下一次循环中第一个数是(2,2)最后一一个数是(n-1,n-1)
注意 这里所说的数是该数的位置
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<iomanip> using namespace std; int a[100][100]; int main() { int n,x,y,tot; cin>>n; tot=a[x=0][y=0]=1; while(tot<n*n) { while(y+1<n&&!a[x][y+1]) a[x][++y]=++tot; while(x+1<n&&!a[x+1][y]) a[++x][y]=++tot; while(y-1>=0&&!a[x][y-1]) a[x][--y]=++tot; while(x-1>=0&&!a[x-1][y]) a[--x][y]=++tot; } for(int i=0;i<n;i++){ for(int j=0;j<n;j++) cout<<setw(3)<<a[i][j]<<" "; cout<<endl; } return 0; }
标签:return 代码 setw str style iostream namespace 注意 ccf
原文地址:http://www.cnblogs.com/z360/p/6286225.html