zoukankan      html  css  js  c++  java
  • nyoj 1129 Salvation(搜索)

    Salvation
    时间限制:1000 ms  |  内存限制:65535 KB 
    难度:3
    描述 
         
        神秘瀑布镇是一个神秘的地方,那里有吸血鬼,狼人,巫师,二重身。 Klaus(吸血鬼祖先) 为了利用 Elena 的血液发展他的混血大军(吸血鬼&狼人),也来到了神秘瀑布镇。Stefan 因为深爱着 Elena ,于是 Stefan 决定去唤醒吸血鬼猎人,来解救 Elena 。

         吸血鬼猎人被封锁在一个迷宫里,这个迷宫有一种特性,只要进入就会失去方向感。于是 Stefan 想到一种方法,以左为标准(即优先左走),其次向前,向右,如果都无法走就向后走(即向右转两次)。他可以向上下左右四个方向的空格移动一个格,每次耗费1分钟。Stefan 在得知你是一个有天赋的程序员后,决定让你判断他是否能找到吸血鬼猎人。

    输入输入包含多组测试数据,第一行输入 n , m ( 2 < n ,m <= 100) ,接下来n行每行m个字符,第 n + 2 行一个字符表示初始方向(E W S N)。
    “.”代表空格 ,“#”代表墙 , “ T ”代表初始位置,“X”代表吸血鬼猎人的位置。输出输出一行,如果能找到输出“YES”,否则输出“NO”。样例输入4 4
    ....
    .##.
    .##.
    TX..
    N
    4 4
    ....
    .##.
    .###
    T#.X
    N
    样例输出YES
    NO

    提示优先左走即:如果左边能走就向左走,如果不能走向前走,如果前不能走,向右走,如果右不能走向后走。

    思路:如果可以向左走就会一直向左走,用深搜,按优先顺序搜索(代码就很bad ,hahahah)。

    #include<map>
    #include<stack>
    #include<queue>
    #include<math.h>
    #include<vector>
    #include<string>
    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define maxn 105
    #define maxm 100005
    #define mod 1000000007
    #define ll long long
    #define inf 0x3f3f3f3f
    using namespace std;
    string s[maxn];
    struct node{
        int x,y;
    }src,last;
    int n,m;
    int vis[10][maxn][maxn];
    int check(char a){
        if(a=='N')return 0;
        if(a=='W')return 1;
        if(a=='S')return 2;
        if(a=='E')return 3;
    }
    bool judge(int x,int y){
        if(x>=0&&x<n&&y>=0&&y<m&&s[x][y]!='#')
            return true;
        return false;
    }
    int dfs(int x,int y,char d){
        char t;int dir;
        if(x==last.x&&y==last.y)return 1;
        if(d=='N'){
        if(judge(x,y-1)){t='W';dir=check(t);
        if(vis[dir][x][y-1]==1)return 0;else{vis[dir][x][y-1]=1; return dfs(x,y-1,t);}}
        else if(judge(x-1,y)){t='N';dir=check(t);
        if(vis[dir][x-1][y]==1)return 0;else{vis[dir][x-1][y]=1; return dfs(x-1,y,t);}}
        else if(judge(x,y+1)){t='E';dir=check(t);
        if(vis[dir][x][y+1]==1)return 0;else{vis[dir][x][y+1]=1 ;return dfs(x,y+1,t);}}
        else if(judge(x+1,y)){t='S';dir=check(t);
        if(vis[dir][x+1][y]==1)return 0;else{vis[dir][x+1][y]=1; return dfs(x+1,y,t);}}
        else return 0;
        }
        if(d=='W'){
        if(judge(x+1,y)){t='S';dir=check(t);
        if(vis[dir][x+1][y]==1)return 0;else{vis[dir][x+1][y]=1; return dfs(x+1,y,t);}}
        else if(judge(x,y-1)){t='W';dir=check(t);
        if(vis[dir][x][y-1]==1)return 0;else{vis[dir][x][y-1]=1; return dfs(x,y-1,t);}}
        else if(judge(x-1,y)){t='N';dir=check(t);
        if(vis[dir][x-1][y]==1)return 0;else{vis[dir][x-1][y]=1; return dfs(x-1,y,t);}}
        else if(judge(x,y+1)){t='E';dir=check(t);
        if(vis[dir][x][y+1]==1)return 0;else{vis[dir][x][y+1]=1; return dfs(x,y+1,t);}}
        else return 0;
        }
        if(d=='S'){
        if(judge(x,y+1)){t='E';dir=check(t);
        if(vis[dir][x][y+1]==1)return 0;else{vis[dir][x][y+1]=1; return dfs(x,y+1,t);}}
        else if(judge(x+1,y)){t='S';dir=check(t);
        if(vis[dir][x+1][y]==1)return 0;else{vis[dir][x+1][y]=1; return dfs(x+1,y,t);}}
        else if(judge(x,y-1)){t='W';dir=check(t);
        if(vis[dir][x][y-1]==1)return 0;else {vis[dir][x][y-1]=1;return dfs(x,y-1,t);}}
        else if(judge(x-1,y)){t='N';dir=check(t);
        if(vis[dir][x-1][y]==1)return 0;else {vis[dir][x-1][y]=1;return dfs(x-1,y,t);}}
        else return 0;
        }
        if(d=='E'){
        if(judge(x-1,y)){t='N';dir=check(t);
        if(vis[dir][x-1][y]==1)return 0;else {vis[dir][x-1][y]=1;return dfs(x-1,y,t);}}
        else if(judge(x,y+1)){t='E';dir=check(t);
        if(vis[dir][x][y+1]==1)return 0;else {vis[dir][x][y+1]=1;return dfs(x,y+1,t);}}
        else if(judge(x+1,y)){t='S';dir=check(t);
        if(vis[dir][x+1][y]==1)return 0;else {vis[dir][x+1][y]=1;return dfs(x+1,y,t);}}
        else if(judge(x,y-1)){t='W';dir=check(t);
        if(vis[dir][x][y-1]==1)return 0;else {vis[dir][x][y-1]=1;return dfs(x,y-1,t);}}
        else return 0;
        }
    }
    int main(){
        while(~scanf("%d%d",&n,&m)){
                mem(vis,0);
            for(int i=0;i<n;i++){
                cin>>s[i];
                for(int j=0;j<m;j++){
                    if(s[i][j]=='T'){src.x=i;src.y=j;}
                    if(s[i][j]=='X'){last.x=i;last.y=j;}
                }
            }
            char dir;cin>>dir;
            if(dfs(src.x,src.y,dir)==1)
                printf("YES
    ");
            else
                printf("NO
    ");
        }
    }


  • 相关阅读:
    oc对象的内存管理
    OC类的本质,深入探讨,load方法和initialize方法
    OC特有语法:分类category,给NSString增加方法计算字符串中数字的个数
    OC的类的构造方法
    OC的@property 和 @synthesize id
    HTML5 Canvas时间效果
    各浏览器的Hack写法【转】
    你自认为理解了JavaScript?【转】
    八大疯狂的HTML5 Canvas及WebGL动画效果——8 CRAZY ANIMATIONS WITH WEBGL AND HTML5 CANVAS【收藏】
    一些达成共识的JavaScript编码风格约定【转】
  • 原文地址:https://www.cnblogs.com/da-mei/p/9053237.html
Copyright © 2011-2022 走看看