• 奋战杭电ACM(DAY6)1010


    纠结了两天的题,一开始自己想不出来,上网搜前辈的解题报告,没看懂……快哭了

    对算法掌握太少了,知道知识点是深度优先遍历(DFS)和剪枝(本题特殊在奇偶剪枝),于是花了一天的时间学习这两个知识点,到处翻书哇!!于是还是没做出来……但是又结合前辈的解题报告,这次能看懂了!!微笑

    然后自己做,失败2次……第三次解决了!!提交,一次AC!!微笑

    作对这道题成就感胜过昨天AC4到啊!!微笑

    总结一下,本题的思路还是很明确的,DFS出所有走法,再根据条件剪枝,优化,减少时间空间损耗。

    Tempter of the Bone

    #include <iostream>
    #include <string>
    #include <cmath>
    using namespace std;
    
    int N,M,T,end_i,end_j;
    bool visited[6][6],res;//因为1<N,M<7,所以开到6就可以
    char maze[6][6];
    
    void DFS(int i, int j, int t)
    {
        if(res) return;//吭哧吭哧剪枝ing……
        if(t>T) return;
        if(i<0 || i>=N || j<0 || j>=M) return;
        int temp;
        temp= abs(i-end_i)+abs(j-end_j);
        if((T-t-temp) & 1) return;//奇偶剪枝
        if(t==T && maze[i][j]=='D')
            {res=true; return;}
        
        if(!visited[i-1][j] && maze[i-1][j]!='X')//DFS出所有走法……四个方向~~
        {
            visited[i-1][j]=true;//如下
            DFS(i-1, j, t+1);
            visited[i-1][j]=false;//这两步很巧妙!!
        }
        if(!visited[i+1][j] && maze[i+1][j]!='X')
        {
            visited[i+1][j]=true;
            DFS(i+1, j, t+1);
            visited[i+1][j]=false;
        }
        if(!visited[i][j-1] && maze[i][j-1]!='X')
        {
            visited[i][j-1]=true;
            DFS(i, j-1, t+1);
            visited[i][j-1]=false;
        }
        if(!visited[i][j+1] && maze[i][j+1]!='X')
        {
            visited[i][j+1]=true;
            DFS(i, j+1, t+1);
            visited[i][j+1]=false;
        }
    }
    
    int main()
    {
        while(cin >> N >> M >> T && (N || M || T))//这次还学到了bool型的用法,节省了不少!!
        {
            int i,j,k=0,s_i,s_j,min;
            memset(visited, false, sizeof(visited));//这个也很新颖,一次性全部赋值,头文件<string>
            for(i=0; i<N; i++)
            {
                for(j=0; j<M; j++)
                {
                    cin >> maze[i][j];
                    if(maze[i][j]=='S')
                        {s_i=i; s_j=j; visited[i][j]=true;}
                    if(maze[i][j]=='D')
                        {end_i=i; end_j=j;}
                    if(maze[i][j]=='X')
                        k+=1;
                }
            }
            res=false;
            min=abs(s_i-end_i) + abs(s_j-end_j);
            if(abs(min-T)%2==0 && min<=T && (N*M-k-1>=T))//各种剪枝~~~^O^
                DFS(s_i,s_j,0);
            if(res)
                cout << "YES" << endl;
            else
                cout << "NO" << endl;
        }
        return 0;
    }


  • 相关阅读:
    使用yum更新时不升级Linux内核的方法
    centos7 redmine安装过程(转载)
    CentOS7安装GitLab、汉化、邮箱配置及使用(转载)
    [bzoj2780][Spoj8093]Sevenk Love Oimaster_广义后缀自动机
    [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树
    [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp
    OI模板のpoke流[大型考试复习必备/kl]
    [bzoj2453]维护队列_带修改莫队
    [bzoj4519][Cqoi2016]不同的最小割_网络流_最小割_最小割树
    [bzoj3894]文理分科_网络流_最小割
  • 原文地址:https://www.cnblogs.com/ques3512012019/p/3295207.html
Copyright © 2020-2023  润新知