HDU 1983 BFS&&DFS

最多只需要封锁4个区域即可,DFS封锁的区域,BFS是否可通过

#include "stdio.h"
#include "string.h"
#include "queue"
using namespace std;

int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

int s_x,s_y,n,m,t;
char str[11][11];

struct node
{
    int x,y,step,key;
};
int bfs()
{
    queue<node>q;
    node cur,next;
    int i;
    int hash[11][11][2];

    cur.x=s_x;
    cur.y=s_y;
    cur.step=0;
    cur.key=0;
    q.push(cur);
    memset(hash,0,sizeof(hash));
    hash[s_x][s_y][0]=1;

    while (!q.empty())
    {
        cur=q.front();
        q.pop();
        if (cur.step>=t) return -1;

        for (i=0;i<4;i++)
        {
            next.x=cur.x+dir[i][0];
            next.y=cur.y+dir[i][1];
            if (next.x<0 || next.y<0 || next.x>=n || next.y>=m) continue;
            if (str[next.x][next.y]=='#') continue;
            next.step=cur.step+1;
            next.key=cur.key;
            if (str[next.x][next.y]=='J')
                next.key=1;
            if (hash[next.x][next.y][next.key]==1) continue;
            hash[next.x][next.y][next.key]=1;
            q.push(next);
            if (str[next.x][next.y]=='E' && next.key==1) return 1;
        }
    }
    return -1;
}

int dfs(int k)
{
    int i,j;
    char ch;
    if (k==0)
        return bfs();

    for (i=0;i<n;i++)
        for (j=0;j<m;j++)
        if (str[i][j]=='J' || str[i][j]=='.')
        {
            ch=str[i][j];
            str[i][j]='#';
            if (dfs(k-1)==-1)
                return -1;
            str[i][j]=ch;
        }
    return 1;
}
int main()
{
    int Case,i,j;
    scanf("%d",&Case);
    while (Case--)
    {
        scanf("%d%d%d",&n,&m,&t);
        for (i=0; i<n; i++)
        {
            scanf("%s",str[i]);
            for (j=0; j<m; j++)
                if(str[i][j]=='S')
                {
                    s_x=i;
                    s_y=j;
                    break;
                }
        }

        if (bfs()==-1)
        {
            printf("0\n");
            continue;
        }

        if (dfs(1)==-1)
            printf("1\n");
        else
            if (dfs(2)==-1)
            printf("2\n");
        else
            if (dfs(3)==-1)
            printf("3\n");
        else
            printf("4\n");
    }
    return 0;
}
时间: 2024-11-05 18:39:54

HDU 1983 BFS&&DFS的相关文章

hdu 1983(BFS+DFS) 怪盗Kid

http://acm.hdu.edu.cn/showproblem.php?pid=1983 首先,题目要求出口和入口不能封闭,那么,只要把出口或入口的周围全给封闭了那盗贼肯定无法成功偷盗,出口或入口周围最多 会有四个点,所以初始答案ans=4(没必要计算出出口或入口可以封闭的最小值,就初始为4就好),然后从一到四枚举看有没有 最小的符合条件的值, 所以先用BFS查找出至少偷到一个宝石的最小时间的路径,记录下来,然后枚举封闭路径上的点递归回去,再BFS判断是否能偷盗 成功---DFS中插入BFS

HDU 1983 BFS&amp;amp;&amp;amp;DFS

大多数刚需封锁4区域可以,DFS地区封锁.BFS无论是通过 #include "stdio.h" #include "string.h" #include "queue" using namespace std; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int s_x,s_y,n,m,t; char str[11][11]; struct node { int x,y,step,key; }; int

hdu 1044 bfs+dfs

//方便以后回顾错误//http://acm.hdu.edu.cn/showproblem.php?pid=1044//题意 给定起点.终点和图上的宝藏的权值,问 在规定的步数内能否从起点走到终点:若能走到,可携带宝藏的总价值最大是多少 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<queue> 5 #include<vector> 6 using n

hdu 1044(bfs+dfs+剪枝)

Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6739    Accepted Submission(s): 1564 Problem Description It is written in the Book of The Lady: After the Creation, the cruel

hdu 4771 Stealing Harry Potter&#39;s Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@'  表示的是起点,'#' 表示的是障碍物不能通过,'.'  表示的是路能通过的: 目的:让你从 '@' 点出发,然后每个点只能走一次,求出最小的距离: 解题思路:先用 bfs 求解出任意两点之间的距离,用 ans[i][j],表示点 i 到点  j 的距离: 然后用 dfs 递归求出从起点经过所有点的距离中,比较出最小的: AC代码: 1 #include<iostream>

HDU 1254 (经典游戏)推箱子 BFS+dfs

Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动. 现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格. Input 输入数据的第一行是一个整数T(1<=T<=20),代表测试

HDU 4771 Stealing Harry Potter&#39;s Precious(BFS + DFS)

HDU 4771 Stealing Harry Potter's Precious 题目链接 题意:给定人的起始位置和k个宝物,求人拿完全部宝物最小的步数 思路:先bfs打出两两之间路径,然后dfs暴力求答案,因为宝物才4个,所以暴力是没问题的 代码: #include <stdio.h> #include <string.h> #include <queue> #include <algorithm> using namespace std; const

PKU 1562/HDU 1241 Oil Deposits(原油有多少块区域---BFS,DFS)

Oil Deposits Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region o

HDU ACM 1044 Collect More Jewels BFS+DFS

题意:在一个迷宫中,有一些宝物,从起点走到终点,问在给定的时间内,到达终点后所能拾取珠宝的最大价值. 分析(BFS+DFS): 1.求入口到第一个取宝物的地方的最短距离 2.求第i个取宝物的地方到第i+1个取宝物的地方的最短距离 3.求第n个取宝物的地方到出口的最短距离 4.保证以上3点能在时间L内实现的情况下,取得的宝石价值最大. BFS特点:对于解决最短或最少问题特别有效,而且寻找深度小,但缺点是内存耗费量大(需要开大量的数组单元来存储状态) DFS特点:对于解决遍历和求所有问题有效,对于问