zoukankan      html  css  js  c++  java
  • [HDU] 1010 Tempter of the Bone最基本的深搜

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1010

    方法:由于该题搜索的目标状态是准确的状态,即目标状态要求在到达的时候时间刚好是那么多,不能提前到达也不能延后到达,这和时间要在规定时间内或者求最小时间不一样,所以不用广搜用深搜。在深搜的时候要注意几个问题,

    1.从一个顶点开始向四个方向深搜的之前(要是这个方向可以走的话),要把该顶点设置为不再可走(将该点设置为wall),这样来实现走过的路不能回去再走。而当该顶点四个方向深搜完成后,如果没有找到目标状态,则需要将其还原为可以走,因为有其他顶点开始的深搜会走到该点,而此时该点在这个状态下还没有走过。通过这种方式又实现了回溯。

    2.当走到一个顶点发现该顶点就是door,但当前时间还不到规定时间,当然这种状态不是目标状态,但不会像其他点(road)那样,就此开始递归开启一段新的深搜,而是直接返回。

    感想:体会下其中的剪枝。

    代码:

    View Code
    #include<iostream>
    using namespace std;
    int maps[9][9];
    int n,m,t;
    int doorX, doorY,startX, startY;
    char wall = 'X';
    char door = 'D';
    char start = 'S';
    char emptyBlock = '.';
    bool DFSSearch(int x, int y, int time)
    {
        if(x<1 ||x>n ||y <1||y>m)
            return false;
        int j = time-(abs(x-doorX)+abs(y-doorY));
        if(j<0)
            return false;
        char temp = maps[x][y];
        if(time==0 && maps[x][y] ==door)
            return true;
        else
        {
            if(maps[x][y]!=door)
            {
                maps[x][y] = wall;
                if(maps[x][y+1] != wall && DFSSearch(x,y+1,time-1))
                    return true;
                if(maps[x][y-1] != wall && DFSSearch(x,y-1,time-1))
                    return true;
                if(maps[x+1][y] != wall && DFSSearch(x+1,y,time-1))
                    return true;
                if(maps[x-1][y] != wall && DFSSearch(x-1,y,time-1))
                    return true;
                maps[x][y] = temp;
                return false;
            }
            return false;
        }
    }
    int main()
    {
        while(cin>>n>>m>>t)
        { 
            if(n==0 && m==0 && t==0)
                break;  
            else
            {
                char input;  
                for(int i =1;i<=n;i++)
                    for(int j=1;j<=m;j++)
                    {
                        cin>>input;
                        if(input == start)
                        {
                            startX = i; startY = j;
                        }
                        if(input == door)
                        {
                            doorX = i; doorY = j;
                        }
                        maps[i][j]=input;
                    }
                int temp= t-(abs(startX-doorX)+abs(startY-doorY));
                if(temp<0 ||temp%2==1)
                    cout<<"NO"<<endl;
                else if(DFSSearch(startX,startY,t))
                    cout<<"YES"<<endl;
                else
                    cout<<"NO"<<endl;
    
            }
        }
        return 0;
    }
  • 相关阅读:
    第一次Java作业
    第十一次作业
    第十次作业
    第九次作业
    第八次作业
    第七次作业
    第六次作业
    Java中数组自定义排序与优先级队列笔记
    力扣每日一题:删除链表的倒数第N个节点
    又一次离谱的错误——运算符优先级
  • 原文地址:https://www.cnblogs.com/kbyd/p/3021938.html
Copyright © 2011-2022 走看看