3 条题解
-
0
#include<bits/stdc++.h> using namespace std; int a[50][50]; int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; int main() { memset(a,0,sizeof a); int n;scanf("%d",&n); int x=1,y=1,t=2,d=0;a[1][1]=1; while(t<n*n) { int xx=x+dx[d],yy=y+dy[d]; if(xx>0&&xx<=n&&yy>0&&yy<=n&&a[xx][yy]==0) { a[xx][yy]=t; x=xx;y=yy; } else { d=(d+1)%4; x+=dx[d];y+=dy[d]; a[x][y]=t; } t++; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i][j]==0)printf("T "); else printf("%d ",a[i][j]); } puts(""); } return 0; } -
-1
就是螺旋矩阵把最后一个数字改为字符T, 不懂的看这个:
再改一下旋转方向
#include<bits/stdc++.h> using namespace std; int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};//移动过程 int a[50][50]; int main() { int n;scanf("%d",&n); a[1][1]=1; int x=1,y=1,t=0,k=2; while(k<n*n) { if(a[x+dx[t]][y+dy[t]]||x+dx[t]>n||x+dx[t]<1||y+dy[t]>n||y+dy[t]<1)t=(t+1)%4; x+=dx[t]; y+=dy[t]; a[x][y]=k; k++; }//螺旋矩阵:注意不能k<=n*n,因为正中间是头T for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i][j])printf("%d ",a[i][j]);//有数字就不是龙头 else printf("T ");//未填就是龙头了 } puts(""); } return 0; } -
-1
回型矩阵,一直绕圈圈就可以到达中间(其实分析样例也行)
#include<bits/stdc++.h> using namespace std; int dx[4]={0,1,0,-1};//四种方向要按照这个顺序 int dy[4]={1,0,-1,0}; const int N=50; int a[N][N]; int main() { int n; scanf("%d",&n); int x=1,y=1,k=0,fx=0; while(k<n*n)//每一个点 { a[x][y]=++k;//赋值 if(x+dx[fx]<1||x+dx[fx]>n||y+dy[fx]<1||y+dy[fx]>n||a[x+dx[fx]][y+dy[fx]])fx=(fx+1)%4;//如果要转向(碰到边缘) x+=dx[fx],y+=dy[fx];//移动 } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i!=(n+1)/2||j!=(n+1)/2)printf("%d ",a[i][j]); else putchar('T'),putchar(' ');//到达了正中间 } puts(""); } return 0;//完结撒花 }
- 1
信息
- ID
- 8265
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 5
- 标签
- 递交数
- 20
- 已通过
- 13
- 上传者