4 条题解
-
4
介绍一种递归写法
#include<stdio.h> int n, cnt; int a[105][105], vis[105][105]; int check(int x, int y) { if(x < 1 || x > n || y < 1 || y > n) return 0;//看是否越界(出地图) else if(vis[x][y]) return 0; //判断是否走过 else return 1; //能走 } void dfs(int x, int y, int dirt) { a[x][y] = ++cnt; vis[x][y] = 1;//标记这个点是否走过 while(1) //因为要四个方向轮流转,所以是一个周期。 { if(cnt == n * n) return ; //当填满n * n结束 if(dirt % 4 == 0) //第一次往下 { if(check(x + 1, y)) dfs(x + 1, y, dirt); else dirt++; //直到下边没地方走 } if(dirt % 4 == 1) { if(check(x, y - 1)) dfs(x, y - 1, dirt);//第二次往左 else dirt++; } if(dirt % 4 == 2) //第三次往上 { if(check(x - 1, y)) dfs(x - 1, y, dirt); else dirt++; } if(dirt % 4 == 3) //第四次往右 { if(check(x, y + 1)) dfs(x, y + 1, dirt); else dirt++; } } } int main() { scanf("%d",&n); dfs(1, n, 0);//由题目看出起点在(1, n),第三个量存的是方向 for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { printf("%d ",a[i][j]); } printf("\n"); } return 0; }
-
1
#include<stdio.h> int main() { int n; scanf("%d",&n); int nn=n*n; int x=1,y=n; int fx=0; int num[101][101]={0}; for(int i=1;i<=nn;i++){ num[x][y]=i; if(fx==0){ //下 if(x+1>n||num[x+1][y]!=0){ //提前预判下一位越界或者碰头 fx=1;//改变方向 y--; } else{ x++; } } else if(fx==1){ //左 if(y-1<1||num[x][y-1]!=0){ fx=2;//改变方向 x--; } else{ y--; } } else if(fx==2){ //上 if(x-1<1||num[x-1][y]!=0){ fx=3;//改变方向 y++; } else{ x--; } } else if(fx==3){ //右 if(num[x][y+1]!=0){ fx=0;//改变方向 x++; } else{ y++; } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ printf("%d ",num[i][j]); } printf("\n"); } return 0; }
-
1
wasd = [[0, 1], [-1, 0], [0, -1], [1, 0]]#控制snake方向 n = int(input()) square = [[0 for _ in range(n + 1)] for __ in range(n + 1)]#创建初始矩阵,多创建一格防止outofindex def sq_print(): #按题目格式打印最终结果 for i in range(n): for j in range(n): print(square[i][j], end = ' ') print() def sq_fill(): x = n - 1 y = 0#初始位置 ctrl = 0#控制转向符 for i in range(1, n * n + 1): square[y][x] = i x += wasd[ctrl][0] y += wasd[ctrl][1] if ((x == n - 1) and (y == n - 1)) or ((x == 0) and (y == n - 1)) or ((x == 0) and (y == 0)) or (square[y + wasd[ctrl][1]][x + wasd[ctrl][0]] != 0): #当snake触及矩阵底部,或snake将要前往的下一个位置已经有数字的时候,控制转向 ctrl += 1 ctrl %= 4#控制符应该是{0,1,2,3},即模4的循环群 sq_fill() sq_print()
-
0
#include<stdio.h> int main() { int a,b,c,d,n,sum=1; int yi[101][101]; scanf("%d",&n); for(a=0;a<=(n-1)/2;a++) { for(b=a;b<=n-a-1;b++) yi[b][n-a-1]=sum++; for(b=n-2-a;b>=a;b--) yi[n-a-1][b]=sum++; for(b=n-a-2;b>=a;b--) yi[b][a]=sum++; for(b=a+1;b<n-a-1;b++) yi[a][b]=sum++; } for(c=0;c<n;c++) { for(d=0;d<n;d++) printf("%d ",yi[c][d]); printf("\n"); } }
- 1
信息
- ID
- 131
- 时间
- 3000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 541
- 已通过
- 179
- 上传者