数据结构实验之栈与队列十:走迷宫
Time Limit: 1000 ms Memory Limit: 65536 KiB
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 种走法。
#include <stdio.h>
#include <stdlib.h>
//借鉴于小自洽
int book[1000][1000], e[1000][1000];
int step, n, m;
void dfs(int x,int y)
{
if(x == n && y == m)
{
step++;
return ;
}
int next[4][2] = {{0,1},{0,-1},{-1,0},{1,0}};//四个方向,二维数组存放列上下或行左右的加减一变换;
int tx,ty; //判断下一个点
int i;
for(i=0;i<=3;i++)
{
tx = x + next[i][1];
ty = y + next[i][0];
if(tx < 1 || tx > n || ty < 1 || ty > m)
continue; //判断是否越界
if(e[tx][ty] == 0 && book[tx][ty] == 0)//判断是否为障碍点或者重复点
{
book[tx][ty] = 1; //不能重复走;
dfs(tx,ty); // 尝试下一步
book[tx][ty] = 0;//释放上一格为可走;
}
}
return ;
}
int main()
{
int i, j, t;
scanf("%d",&t);
while(t--)
{
step = 0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&e[i][j]);
}
}
book[1][1] = 1;
dfs(1,1);
printf("%d\n",step);
}
return 0;
}
深度优先搜索是解决当前的情况,至于下一步和当前这一步是一样的,只需要把当前的情况放进一个函数中,直接引用就可以了;这个题是先判断是否到达终点,如果没有就找下一步可以走的路
深度优先搜索的基本模型:
void dfs(int step)
{
判断边界
尝试每一种可能for(i=1;i<=n;i++)
{
继续下一步 dfs(step+1);
}
返回
}
Catch That Cow 找奶牛
Time Limit: 2000 ms Memory Limit: 65536 KiB
Problem Description
Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting. * Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute * Teleporting: FJ can move from any point X to the point 2 × X in a single minute. If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?
Input
Line 1: Two space-separated integers: N and K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
5 17
Sample Output
4
对于广度优先搜索 bfs 的理解 整理
这个是典型的广搜问题,因为要求的是最短的路径,类似的有迷宫问题找路之类的,广搜一般要用一个结构体(对象)来代表每一个状态,用一个队列queue来记录先后的访问顺序,并且一定要注意状态的边界条件和状态的转换关系(本期中是位置变化的转换关系),农夫可以向前找(+1 表示),也可以向后找(-1 表示),也是跨距离找(* 2表示)
注意的地方是 1,广搜的时候每次访问完队头的节点后要把它pop出去。
2, DFS 和BFS 一般实现时都要用一个大的visited 数组表示是否已经访问过了。
3, 多种情形扩展时,不能用 else if 而是用并列的 if (DFS也一样),否则搜索空间会减小,一些状态不会被枚举到,else if 直接跳过剩下的cases,一些点就没有入队。 这是一个隐藏的坑。
(该内容为转载)