首页 > 学院 > 开发设计 > 正文

走迷宫

2019-11-08 20:08:47
字体:
来源:转载
供稿:网友

think: 1题目似乎没有很明显的模板性,我是否应该反思转换学习图的方法,自己目前的认识水平这个题目很难找到DFS与BFS的影子,自己应该把思维延伸,将DFS与BFS的思想运用到解题中,而不是急于求成,越是急于求成,根基越是不牢,最后只会导致自己寸步难行,既然自己在学习图的存储结构中决定展现自己的做题风格,那么自己越是艰难越不能盲目做题, 题目说每次可以往上下左右四个方向移动也就意味着每在一个有效位置最多可有4种选择方案,从一个点移动到另一个点是否意味着更适合深度优先搜索,而对于从一个点回到这个点,是否意味着更适合广度优先搜索,深度优先搜索的思想是否又与递归思想有着千丝万缕的关系呢?为广度优先搜索的思想是否又与队列思想有着千丝万缕的关系呢?不断摸索,更要不断反思总结,只有这样才能进步

sdut原题链接

走迷宫 Time Limit: 1000MS Memory Limit: 65536KB

PRoblem Description 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数。

Input 第一行一个整数T 表示有T 组测试数据。(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子。(1 <= n, m <= 6, (n, m) !=(1, 1) ) 接下来n 行,每行m 个数。其中第i 行第j 个数是0 表示第i 行第j 个格子可以走,否则是1 表示这个格子不能走,输入保证起点和终点都是都是可以走的。 任意两组测试数据间用一个空行分开。

Output 对于每组测试数据,输出一个整数R,表示有R 种走法。

Example Input 3 2 2 0 1 0 0 2 2 0 1 1 0 2 3 0 0 0 0 0 0

Example Output 1 0 4

Hint

Author

以下为accepted代码

#include <stdio.h>#include <string.h>int a[9][9], visit[9][9];int n, m, flag;void ans(int fn, int fm){ int i, tn, tm; int jn[] = {0, 0, -1, 1}; int jm[] = {-1, 1, 0, 0}; for(i = 0; i < 4; i++) { tn = fn + jn[i]; tm = fm + jm[i]; if(tn == n && tm == m) flag++; else if(tn >= 1 && tn <= n && tm >= 1 && tm <= m) { if(a[tn][tm] == 1 && visit[tn][tm] == 0) { visit[tn][tm] = 1; ans(tn, tm); //visit[tn][tm] = 0; } } } visit[fn][fm] = 0;}int main(){ int T, i, j, x; scanf("%d", &T); while(T--) { flag = 0; memset(a, 0, sizeof(a)); memset(visit, 0, sizeof(visit)); scanf("%d %d", &n, &m); for(i = 1; i <= n; i++) { for(j = 1; j <= m; j++) { scanf("%d", &x); if(x == 0) a[i][j] = 1; else a[i][j] = 0; } } visit[1][1] = 1; ans(1, 1); printf("%d/n", flag); } return 0;}/***************************************************User name: Result: AcceptedTake time: 520msTake Memory: 116KBSubmit time: 2017-02-15 18:22:18****************************************************/
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表