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-10-17 12:46:20

HDU 1983 BFS&amp;&amp;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;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; }; i

HDU 1180 诡异的楼梯 (DFS)

诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 6472    Accepted Submission(s): 1525 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在竖

hdu 1175 bfs 转弯题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 和之前的1728类似.就是判断转弯数,建立一个用于记录转弯数的数组.. 还有就是对于特殊情况要进行考虑,比如起点与终点相同的情况,对于本题来说是不可以消去的应该输出NO.还有就是起点或终点是零这也是不行的,因为0代表没有棋子... 还有在判断能不能走的时候要小心,对于判断条件一定要小心,不要图赶快写.. 错误的地方都写在注释中了.. 代码: // hdu 1175 bfs 转弯数 //1.起点

HDU 哈密顿绕行世界问题 (dfs)

Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每行有1个数m,m<=20,m>=1.m=0退出. Output 输出从第m个城市出发经过每个城市1次又回到m的所有路线,如有多条路线,按字典序输出,每行1条路线.每行首先输出是第几条路线.然后个一个: 后列出经过的城市.参看Sample output

HDU 1241 Oil Deposits --- 入门DFS

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1241 /* HDU 1241 Oil Deposits --- 入门DFS */ #include <cstdio> int m, n; //n行m列 char mapp[105][105]; /* 将和i,j同处于一个连通块的字符标记出来 */ void dfs(int i, int j){ if (i < 0 || j < 0 || i >= n || j >= m

Saving Princess claire_(hdu 4308 bfs模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2305    Accepted Submission(s): 822 Problem Description Princess claire_ wa

hdu 2489 Minimal Ratio Tree(dfs枚举 + 最小生成树)~~~

题目: 链接:点击打开链接 题意: 输入n个点,要求选m个点满足连接m个点的m-1条边权值和sum与点的权值和ans使得sum/ans最小,并输出所选的m个点,如果有多种情况就选第一个点最小的,如果第一个点也相同就选第二个点最小的........ 思路: 求一个图中的一颗子树,使得Sum(edge weight)/Sum(point weight)最小~ 数据量小,暴力枚举~~~~~dfs暴力枚举C(M,N)种情况. 枚举出这M个点之后,Sum(point weight)固定,进行prim或者K

HDU 1072 bfs

Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7083    Accepted Submission(s): 3409 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a tim