|
打印出n*n的螺旋方阵,比如n=5 1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
n=6
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
这个题有很多的做法,每种做法都有一定的技巧,大家都可以认真做做,第一种做法,用udlr表示四个方向,四个方向按个数填充。
- #include <iostream>
- #include <iomanip>
- using namespace std;
- int a[100][100],n;
- int u,d,l,r; //u,d,l,r分别表示上下左右边界
- int i,j,k;
- void pp()
- {
- int r,c;///平面图形输出千万不要用x和y
- for (r=1; r<=n; r++)
- {
- for (c=1; c<=n; c++) cout<<setw(4)<<a[r][c];
- cout<<endl;
- }
- }
- int main()
- {
- cin>>n;
- u=l=1;d=r=n;
- k=1;
- while (k<=n*n)
- {
- for (i=l; i<=r; i++) a[u][i]=k++; //沿着最上面从左到右;
- u++; //上界变化
- for (i=u; i<=d; i++) a[i][r]=k++; //沿着最右边从上到下;
- r--; //右界变化
- for (i=r; i>=l; i--) a[d][i]=k++; //沿着最下边从右到左;
- d--; //上界变化
- for (i=d; i>=u; i--) a[i][l]=k++; //沿着最上面从左到右;
- l++; //上界变化
- }
- pp();
- return 0;
- }
复制代码 更精妙的做法,用drdc方向数组,设置标志终止位。这段带确实值得研究。
- #include <iostream>
- #include <iomanip>
- using namespace std;
- int a[100][100],n;
- int dr[]= {0,1,0,-1};
- int dc[]= {1,0,-1,0}; ///四个方向
- int i,j,r,c,k,d,tr,tc;
- void pp()
- {
- int r,c;///平面图形输出千万不要用x和y
- for (r=1; r<=n; r++)
- {
- for (c=1; c<=n; c++) cout<<setw(4)<<a[r][c];
- cout<<endl;
- }
- }
- int main()
- {
- cin>>n;
- a[1][n+1]=a[n+1][n]=a[n][0]=a[0][1]=1;///四个角标标记 第四个没意义
- r=1;c=0;
- k=1;d=0;
- while (k<=n*n)
- {
- tr=r+dr[d],tc=c+dc[d];///计算下一个位置
- if (a[tr][tc]==0) ///能填的话
- a[r=tr][c=tc]=k++;
- else d=(d+1)%4; ///否则转向
- }
- pp();
- return 0;
- }
复制代码 24楼张天旭同学的做法也值得研究一下。
|
|