数据结构实验之栈与队列十:走迷宫 (转载由小自洽)

数据结构实验之栈与队列十:走迷宫
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,一些点就没有入队。 这是一个隐藏的坑。
(该内容为转载)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值