zoukankan      html  css  js  c++  java
  • HDU 2102 A计划(DFS)

    题目链接

    Problem Description

    可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
    现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。

    Input

    输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。

    Output

    如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。

    Sample Input

    1
    5 5 14
    S*#*.
    .#...
    .....
    ****.
    ...#.
    
    ..*.P
    #.*..
    ***..
    ...*.
    *.#..

    Sample Output

    YES

    题解:一个很有意思的DFS迷宫题(黑公主黑得漂亮),传送“不需要任何时间”这句很有误导性,让人写出dfs(nx,ny,t,!s);这样的代码,实际上,这样忽略了走到传送机的1s,就是WA。刚开始TLE,最后一看,低级错误,没有把‘.’设置成‘*’...

    #include <cstdio>
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <cstring>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #include <map>
    #define PI 3.1415926
    #define ms(a) memset(a,0,sizeof(a))
    #define msp memset(mp,0,sizeof(mp))
    #define msv memset(vis,0,sizeof(vis))
    using namespace std;
    //#define LOCAL
    int n,m,T;
    int sx,sy,si,px,py,pi,flag;
    char mp1[12][12];
    char mp2[12][12];
    int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
    void dfs(int x,int y,int t,int s)//s==1 means floor1,0 ms 2.
    {
        if(x==px&&y==py&&t<=T&&s==pi)flag=true;
        if(flag)return;
        if(t>T)return;
        for(int i=0; i<4; i++)
        {
            int nx=x+dir[i][0],ny=y+dir[i][1];
            if(nx<0||ny<0||nx>=n||ny>=m)continue;
            if(s)
            {
                if(mp1[nx][ny]!='*')
                {
                    if(mp1[nx][ny]=='#')
                    {
                        mp1[nx][ny]='*';
                        dfs(nx,ny,t+1,!s);
                        mp1[nx][ny]='#';
                    }
                    else
                    {
                        mp1[nx][ny]='*';
                        dfs(nx,ny,t+1,s);
                        mp1[nx][ny]='.';
                    }
                }
            }
            else
            {
                if(mp2[nx][ny]!='*')
                {
                    if(mp2[nx][ny]=='#')
                    {
                        mp2[nx][ny]='*';
                        dfs(nx,ny,t+1,!s);
                        mp2[nx][ny]='#';
                    }
                    else
                    {
                        mp2[nx][ny]='*';
                        dfs(nx,ny,t+1,s);
                        mp2[nx][ny]='.';
                    }
                }
            }
        }
    }
    int main()
    {
    #ifdef LOCAL
        freopen("in.txt", "r", stdin);
    #endif // LOCAL
        //Start
        int N;
        cin>>N;
        while(N--)
        {
            cin>>n>>m>>T;
            ms(mp1),ms(mp2),flag=0;
            for(int i=0; i<n; i++)
            scanf("%s",mp1[i]);
            for(int i=0; i<n; i++)
            scanf("%s",mp2[i]);
            for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
            {if(mp1[i][j]=='S')sx=i,sy=j,si=1;
            else if(mp1[i][j]=='P')px=i,py=j,pi=1;
            if(mp2[i][j]=='S')sx=i,sy=j,si=0;
            else if(mp2[i][j]=='P')px=i,py=j,pi=0;
            if(mp1[i][j]=='#'&&mp2[i][j]=='#')mp1[i][j]='*',mp2[i][j]='*';
            if(mp1[i][j]=='*'&&mp2[i][j]=='#')mp1[i][j]='*',mp2[i][j]='*';
            if(mp1[i][j]=='#'&&mp2[i][j]=='*')mp1[i][j]='*',mp2[i][j]='*';}
            if(si)mp1[sx][sy]='*',dfs(sx,sy,0,1);
            else mp2[sx][sy]='*',dfs(sx,sy,0,0);
            if(flag)printf("YES
    ");
            else printf("NO
    ");
        }
        return 0;
    }
  • 相关阅读:
    安全运维中基线检查的自动化
    解决“指定的服务已经标记为删除”问题
    linux让命令或程序在终端后台运行的方法(Ubuntu/Fedora/Centos等一样适用)
    微信小程序、SSL证书、开启服务器TSL1.0、TSL1.1、TSL1.2服务
    linux screen工具
    11.2.0.1升级到11.2.0.4报错之中的一个:UtilSession failed: Patch 9413827
    swift 编译提前定义 --不知道怎么定义,可是能够#if
    编译安装 gcc 4.9并验证使用
    sparkR处理Gb级数据集
    【J2EE】在项目中理解J2EE规范
  • 原文地址:https://www.cnblogs.com/gpsx/p/5173155.html
Copyright © 2011-2022 走看看