您的位置:首页 > 其它

NYOJ 499 迷宫

2013-12-08 06:27 190 查看
NYOJ 499 迷宫 链接
这道题是一个深搜思想, 开始自己在自己想用广搜  可能不能用广搜吧吧, 反正我是没弄出来!其实深搜自己想了不过没想出来杂用·····看了别人的函数恍然醒悟  下面 说下这个深搜咋回事
1:写深搜函数时我是难在不知道咋写, 看见别人代码 恍然知道, 对啊  四个方向都要搜索的的  函数内要分  上下左右 四次调用自身的
2:写出递归 时有一个地方,就是四个递归后面的清零 , 自己怎么也不知道该放哪了,最后还是看了启蒙我得那个 代码跟踪下明白咋回事了, 因为在递归调用前为了表示已经 访问过, 赋值为一了, 在返回上级时则要清零 其实很直白, 你要在四个方向全都访问过  才能把它清零, 这样想 你的清零就有点理所当然的放在四个递归之后  知道后感觉理所当然  而自己考虑时因为掌握不太熟  就有点无从下手的感觉!
#include<stdio.h>
#include<string.h>

int a[10][10], count, n, m;
int b[10][10];
void DFS(int x, int y)
{
if(x > n || x < 1 || y > m || y < 1 || a[x][y] == 1)
{

return ;
}
if(x == n && y == m)
{
count++;
return ;
}
a[x][y] = 1;//赋值为一
DFS(x + 1, y);
DFS(x - 1, y);
DFS(x, y + 1);
DFS(x, y - 1);
a[x][y] = 0;//我靠   想到要清零了  不过不知道把这个语句放哪 我去
}

int main()
{
int t, i, j;
scanf("%d", &t);
while(t--)
{
count = 0;
memset(b, 0, sizeof(b));
scanf("%d%d", &n, &m);
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
scanf("%d", &a[i][j]);
}
}
DFS(1, 1);
printf("%d\n", count);
}
return 0;
}
点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: