|
5#
楼主 |
发表于 2018-8-22 19:51:05
|
只看该作者
还有一个做法,就是在外圈设置一些标记,某些特殊的关键点设置为1,其余的地方都是0,从r=1 c=1开始填充这些0的区域,到达边界的地方就换方向,而换方向巧妙的使用了方向数组,这种方向数组在二维数组中很常用,体会这种做法,很精妙!
- #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;
- int x;
- 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();
- }
- pp();
- return 0;
- }
复制代码
|
|