NYOJ 迷宫寻宝(一)深搜

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=82

做这道题的时候迷迷糊糊的,,果然比较难。。最后也是没有做出来。。请教了一下学长,学长说我基础还不好。。基础果然重要,这道题是一道搜索题,我没有考虑钥匙在门后面的情况,比如aBbSAG 多亏学长指教,通过这道题对深搜的理解又加深了一步~


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int m,n;//行 列
char e[25][25];//储存地图
int a1,b1,c1,d1,e1;//这张图中对应门的钥匙的总数量 

int startx,starty;//标记开始位置
int flag;//是否找到的标记
int book[21][21];

int a2,b2,c2,d2,e2;
//a2,b2,c2,d2,e2分别为可以找到的钥匙数量

int dfs(int x,int y)
{

    if(e[x][y]==‘G‘)//找到
    {
        flag = 1;
        return 1;
    }
    if(e[x][y]==‘X‘)//墙
        return 0;

    switch(e[x][y])
    {
        case ‘a‘:
            a2++;
            e[x][y] = ‘.‘;
            break;
        case ‘b‘:
            b2++;
            e[x][y] = ‘.‘;
            break;
        case ‘c‘:
            c2++;
            e[x][y] = ‘.‘;
            break;
        case ‘d‘:
            d2++;
            e[x][y] = ‘.‘;
            break;
        case ‘e‘:
            e2++;
            e[x][y] = ‘.‘;
            break;
        case ‘A‘:
            if(a1 != a2)
            {
                return 0;
            }
    //        e[x][y] = ‘.‘;
            break;
        case ‘B‘:
            if(b1 != b2)
            {
                return 0;
            }
            else
    //        e[x][y] = ‘.‘;
            break;
        case ‘C‘:
            if(c1 != c2)
            {
                return 0;
            }
    //        e[x][y] = ‘.‘;
            break;
        case ‘D‘:
            if(d1 != d2)
            {
                return 0;
            }
    //        e[x][y] = ‘.‘;
            break;
        case ‘E‘:
            if(e1 != e2)
            {
                return 0;
            }
    //        e[x][y] = ‘.‘;
            break;
    }

    if(x+1<=m&&flag==0&&book[x+1][y]==0)
    {
            book[x+1][y] = 1;
            dfs(x+1,y);
            book[x+1][y] = 0;
    }
    if(y+1<=n&&flag==0&&book[x][y+1]==0)
    {
        book[x][y+1] = 1;
        dfs(x,y+1);
        book[x][y+1] = 0;
    }
    if(x-1>=1&&flag==0&&book[x-1][y]==0)
    {
        book[x-1][y] = 1;
        dfs(x-1,y);
        book[x-1][y] = 0;
    }
    if(y-1>=1&&flag==0&&book[x][y-1]==0)
    {
        book[x][y-1] = 1;
        dfs(x,y-1);
        book[x][y-1] = 0;
    }
    return 0;
}

int main()
{

    char temp;
    //freopen("data.txt","r",stdin);
    while(scanf("%d %d",&m,&n)&&(m+n)!=0)
    {
        memset(book,0,sizeof(book));
        getchar();
        a2 = 0;b2 =0;c2=0;d2=0;e2=0;
        flag = 0;
        a1=0;b1=0;c1=0;d1=0;e1=0;

        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                while(scanf("%c",&temp)&&temp==‘ ‘);
                e[i][j] = temp;
                switch (e[i][j])
                {
                    case ‘a‘:
                        a1++;
                        break;
                    case ‘b‘:
                        b1++;
                        break;
                    case ‘c‘:
                        c1++;
                        break;
                    case ‘d‘:
                        d1++;
                        break;
                    case ‘e‘:
                        e1++;
                        break;
                    case ‘S‘:
                        startx = i;
                        starty = j;
                        break;
                }
            }
            getchar();
        }

        dfs(startx,starty);

        flag==1?cout<<"YES"<<endl:cout<<"NO"<<endl;
    }

    return 0;
}

NYOJ 迷宫寻宝(一)深搜,布布扣,bubuko.com

时间: 2024-10-19 20:58:11

NYOJ 迷宫寻宝(一)深搜的相关文章

NYOJ 293 Sticks 【深搜】+【剪枝】

这是一道让人泪奔的题,它深刻的说明了什么是剪枝,哪怕是再小的一个细节,一旦递归规模增大都会引发巨大的时间消耗,真是神题~ Sticks 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the

迷宫问题(深搜 广搜)

题目描述: 给出一个m*n的迷宫图和一个入口,一个出口. 编一个程序,打印一条从迷宫入口到出口的路径. -1表示走不通,0表示能走,只能上下左右走: 无路可走输出"no way": 样例输入: 8 5-1 -1 -1 -1 -1 0 0 0 0 -1-1 -1 -1 0 -1-1 0 0 0 -1-1 0 0 1 -1-1 0 0 0 -1-1 -1 -1 0 -1-1 0 0 0 -12 18 4 8 5-1 -1 -1 -1 -10 0 0 0 -1-1 -1 -1 0 -1-1

NYoj 素数环(深搜入门)

题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=488 深搜模板: 1 void dfs(int 当前状态) 2 { 3 if(当前状态为边界状态) 4 { 5 记录或输出 6 return; 7 } 8 for(i=0;i<n;i++) //横向遍历解答树所有子节点 9 { 10 //扩展出一个子状态. 11 修改了全局变量 12 if(子状态满足约束条件) 13 { 14 dfs(子状态) 15 } 16 恢复全局变量//回

NYOJ迷宫寻宝(一)【BFS】

迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门.现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏. 输入

nyoj迷宫寻宝(一)

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 7 using namespace std; 8 struct node{ 9 int x,y; 10 }; 11 queue<node> q; 12 char maze[25][25]; //地图 13 int key[5

nyoj 32 组合数 (深搜,不错,好题)

组合数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合. 输入 输入n.r. 输出 按特定顺序输出所有组合. 特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列. 样例输入 5 3 样例输出 543 542 541 532 531 521 432 431 421 321 来源 [苗栋栋]原创 上传者 苗栋栋 与我之前做的方法不相同,以前的是直接将所有的可

NYOJ 迷宫寻宝(一)

# include<iostream> # include<string> # include<string.h> # include<queue> # include<stdio.h> # include<math.h> #include <algorithm> using namespace std; char d[30][30]; int a[5],b[5]; struct Node { int x,y; int n

nyoj 82 迷宫寻宝(一) 【BFS】

迷宫寻宝(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门.现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏. 输入

nyoj 488 素数环(深搜)

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样