• A计划(bfs)


    A计划

    Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 2   Accepted Submission(s) : 1
    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
     

    搜索:

    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    const int MAXN=11;
    char map[2][MAXN][MAXN];
    int vis[2][MAXN][MAXN];
    struct Node{
    	int x,y,z;
    	int t;
    };
    int disx[4]={0,0,1,-1};
    int disy[4]={1,-1,0,0};
    int N,M,T;
    void bfs(int sx,int sy,int sz){
    	memset(vis,0,sizeof(vis));
    	queue<Node>dl;
    	Node a,b;
    	a.x=sx;a.y=sy;a.z=sz;
    	a.t=0;
    	vis[sz][sx][sy]=1;
    	dl.push(a);
    	while(!dl.empty()){
    		a=dl.front();
    		dl.pop();
    	//	printf("%d ",dl.size());
    		for(int i=0;i<4;i++){
    			b.x=a.x+disx[i];b.y=a.y+disy[i];b.z=a.z;b.t=a.t+1;
    			 if(map[b.z][b.x][b.y]=='#'){
    			 b.z=1-b.z;
    			 }
    			 //printf("%d %d %d %d %d
    ",b.x,b.y,b.z,b.t,vis[b.z][b.x][b.y]);
    			// printf("%d %d %d
    ",N,M,T);
    			if(b.x<0||b.y<0||b.x>=N||b.y>=M||vis[b.z][b.x][b.y]||map[b.z][b.x][b.y]=='*')continue;
    			 if(b.t>T)continue;
    			 if(map[b.z][b.x][b.y]=='#')continue;
    			 if(map[b.z][b.x][b.y]=='P'){
    			 	puts("YES");
    			 	return;
    			 }
    			 
    			 vis[b.z][b.x][b.y]=1;
    			 dl.push(b);
    		}
    	}
    	puts("NO");
    }
    int main(){
    	int C;
    	scanf("%d",&C);
    	while(C--){
    		scanf("%d%d%d",&N,&M,&T);
    		for(int z=0;z<2;z++)
    		for(int x=0;x<N;x++)
    		scanf("%s",map[z][x]);//无语了。。。。。。。写成vis了。我去。。。。。。 
    		bfs(0,0,0);
    	} 
    	return 0;
    }

      

  • 相关阅读:
    [转]SDRAM中的一些疑惑点
    [转]如何学习小波分析?
    [转]功率谱和频谱的区别、联系
    使用Vim为每一行自动编号
    [转]阿英 Matlab fftshift 详解
    [转]性噪比和相位失真
    神舟笔记本精盾K480N高频噪声消除方法
    Tips:verilog计数分频计算
    vim的列编辑操作
    【题解】 「CTSC2018」暴力写挂 点分治+虚树+树形dp LOJ2553
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5030840.html
Copyright © 2020-2023  润新知