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; }
信息
- ID
- 131
- 时间
- 3000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 541
- 已通过
- 179
- 上传者