A - A计划

A - A计划
Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u

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
// File Name: ajihua.cpp
// Author: rudolf
// Created Time: 2013年03月18日 星期一 17时47分37秒

#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<queue>
const int MAX=11;
using namespace std;
char map1[2][MAX][MAX];
int mark[2][MAX][MAX];
int dist[4][2]={-1,0,1,0,0,-1,0,1};
int n,m,t;
struct node
{
	int x,y,cen,step;
};

void judge()
{
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		{
			char &a=map1[0][i][j];
			char &b=map1[1][i][j];
			if(a=='#'&&b=='#')
				a=b='*';
			else
			{
				if((a=='#'&&b=='*')||(a=='*'&&b=='#'))
					a=b='*';
			}
		}
//	getchar();
	//cout<<"aaaaaaaaaaaaaaaa";
}

int bfs()
{
//	cout<<"aaaaaaaaaaaaaaaaa";
	queue<node> Q;
	node cur,p,q,next;
	memset(mark,0,sizeof(mark));
	cur.x=0;
	cur.y=0;
	cur.cen=0;
	cur.step=0;
	Q.push(cur);
//	Q.pop();
	mark[0][0][0]=1;
	while(!Q.empty())
	{
		cur=Q.front();
		Q.pop();
		for(int i=0;i<4;i++)
		{
			next.x=cur.x+dist[i][0];
			next.y=cur.y+dist[i][1];
			next.cen=cur.cen;
			if(next.x<0||next.y<0||next.x>=n||next.y>=m)
				continue;
			if(mark[next.cen][next.x][next.y]||map1[next.cen][next.x][next.y]=='*')
				continue;
			if(map1[next.cen][next.x][next.y]=='#')
			{
				next.cen=!next.cen;
				if(mark[next.cen][next.x][next.y])
					continue;
			}
			if(map1[next.cen][next.x][next.y]=='P')
				return cur.step+1;
			next.step=cur.step+1;
			mark[next.cen][next.x][next.y]=1;
			Q.push(next);
		}
	}
	return -1;
}
					
		
int main()
{
	int N;
	int i,j,k,z;
//	int n,m,t;
	cin>>N;
		while(N--)
		{
			cin>>n>>m>>t;
			memset(map1,0,sizeof(map1));
				for(z=0;z<2;z++)
					for(i=0;i<n;i++)
						for(j=0;j<m;j++)
							cin>>map1[z][i][j];
			//	cout<<"aaaaaaaaaaaaaaaaaa";
//	getchar();
				judge();
		
				int ans=bfs();
				if(ans>t||ans==-1)
					cout<<"NO"<<endl;
				else
					cout<<"YES"<<endl;
		}
	
return 0;
}





// File Name: A计划1.cpp
// Author: rudolf
// Created Time: 2013年03月14日 星期四 21时12分33秒

#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<queue>
#define MAX 20
using namespace std;
char map1[2][MAX][MAX],mark[2][MAX][MAX];
int dist[4][2]={0,1,0,-1,1,0,-1,0};
//char map1[MAX][MAX],mark[MAX][MAX];
int n,m,t;
int cen0,xx,yy;
struct node
{
	int cen;
	int x,y,step;
};
//int bfs(int cc,int aa,int b)
//int bfs(int aa,int bb)
void judge()
{
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		{
			char &a=map1[0][i][j],&b=map1[1][i][j];
			if(a=='#'&&b=='#')
			{
				a=b='*';
			}
			else if((a=='*'&&b=='#')||(a=='#'&&b=='*'))
			{
				a=b='*';
			}
		}
}
int bfs()
{ 
	queue<node> p;
	node cur,next;
	memset(mark,0,sizeof(mark));
	cur.cen=0;
	cur.x=0;
	cur.y=0;
	cur.step=0;
	p.push(cur);
	mark[0][0][0]=1;
	while(!p.empty())
	{
		cur=p.front();
		p.pop();
		for(int i=0;i<4;i++)
		{
			next.x=cur.x+dist[i][0];
			next.y=cur.y+dist[i][1];
			next.cen=cur.cen;
		if(next.x<0||next.y<0||next.x>=n||next.y>=m)
			continue;
		if(map1[next.cen][next.x][next.y]=='*'||mark[next.cen][next.x][next.y])
			continue;
			if(map1[next.cen][next.x][next.y]=='#')
			{
			next.cen=!next.cen;
			if(mark[next.cen][next.x][next.y])
				continue;
			}
		
				if(map1[next.cen][next.x][next.y]=='P')
					return cur.step+1;
				next.step=cur.step+1;
				mark[next.cen][next.x][next.y]=1;
				p.push(next);
		}
	}
	return -1;
}


int main()
{
	int Case;
	int i,j,z,k;
	cin>>Case;
	while(Case--)
	{
		cin>>n>>m>>t;
		memset(map1,0,sizeof(map1));
	/*	for(k=0;k<2;k++)
		{
			for(i=0;i<n;i++)
				scanf("%s",map1[k][i]);
				if(!k)
					getchar();
		}*/
		for(k=0;k<2;k++)
			for(i=0;i<n;i++)
				for(j=0;j<m;j++)
					cin>>map1[k][i][j];
				judge();
		int ans=bfs();
		if(ans==-1||ans>t)
			cout<<"NO"<<endl;
		else
			cout<<"YES"<<endl;
	}
return 0;
}





// File Name: A计划.cpp
// Author: rudolf
// Created Time: 2013年03月13日 星期三 22时37分27秒include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#define MAX 20
using namespace std;
char map1[MAX][MAX][MAX];
int map11[MAX][MAX][MAX];
int cen,x,y;
int visit[MAX][MAX][MAX];
int x_add[4]={-1,1,0,0};
int y_add[4]={0,0,-1,1};
int n,m,t;
int sum;
struct
{
    int cen1,x,y;
}q[101];
int flag;
///
//int bfs(int cen0,int x0,int y0,int cen,int x,int y)
int bfs(int cen0,int x0,int y0)
{
    int xx,yy;
    //cout<<"a";
    memset(visit,0,sizeof(visit));
    int rear=0,front=0;
    q[rear].cen1=cen0;
    q[rear].x=x0;
    q[rear++].y=y0;
    while(rear!=front)
    {
    //    front++;
        if(q[front].cen1==cen&&q[front].x==x&&q[front].y==y)
            return 1;
        front++;
    }
    for(int i=0;i<4;i++)
    {
         xx=x0+x_add[i];
         yy=y0+y_add[i];
        if(map1[cen0][xx][yy]=='#')
        {
            sum++;
        //    cout<<sum;
                cen0=!cen0;
                if(map1[cen0][xx][yy]=='*')
                {
                    flag=1;
                    return 0;
                }
        }
    //    sum++;
    //    cout<<sum;
        if(map1[cen0][xx][yy]=='.')
        {
            sum++;
            if(!visit[cen0][xx][yy])
            {
        //    sum++;
            //cout<<sum;
                visit[cen0][xx][yy]=1;
            }
        //    sum++;
        //    cout<<sum;
        //bfs(cen0,xx,yy,cen,x,y);
    //    bfs(cen0,xx,yy);
        }
    //    sum++;
        cout<<sum;
    }
    bfs(cen0,xx,yy);
}
//
int main()
{
//    int n,m,t;
    //int cen,x,y;
    sum=0;
    cin>>n>>m>>t;
    for(int z=0;z<2;z++)
        for(int i=0;i<n;i++)
        {
        //    cout<<z;
            for(int j=0;j<m;j++)
            {
                cin>>map1[z][i][j];
                if(map1[z][i][j]=='*')
                    visit[z][i][j]=1;
                map11[z][i][j]=map1[z][i][j]-'a';
            //    cout<<map1[i][j][z];
                if(map1[z][i][j]=='P')
                {
                    cen=z,x=i,y=j;
                ///    cout<<cen<<x<<y;
                }
                if(map1[z][i][j]=='S')
                {
                    int cen0=z;
                    int x0=i;
                    int y0=j;
                ///    cout<<cen0<<x0<<y0;
                }
                //cout<<cen<<x<<y;
            }
        //    cout<<endl;
        }
        flag=0;
    //bfs(0,0,0,cen,x,y);
        bfs(0,0,0);
    //    cout<<sum;
    //    cout<<"aaaaaaaaaaaaaaaaa";

        if(flag||sum>t)
        {
            cout<<"NO"<<endl;
        }
        else
        {
            cout<<"YES"<<endl;
        }

return 0;
}







// File Name: A计划1.cpp
// Author: rudolf
// Created Time: 2013年03月14日 星期四 21时12分33秒

#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<queue>
#define MAX 20
using namespace std;
char map1[2][MAX][MAX],mark[2][MAX][MAX];
int dist[4][2]={0,1,0,-1,1,0,-1,0};
//char map1[MAX][MAX],mark[MAX][MAX];
int n,m,t;
int cen0,xx,yy;
struct node
{
    int cen;
    int x,y,step;
};
//int bfs(int cc,int aa,int b)
//int bfs(int aa,int bb)
void judge()
{
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            char &a=map1[0][i][j],&b=map1[1][i][j];
            if(a=='#'&&b=='#')
            {
                a=b='*';
            }
            else if((a=='*'&&b=='#')||(a=='#'&&b=='*'))
            {
                a=b='*';
            }
        }
}

int bfs()
{
//    cout<<"aaaaaaaaaaaa";
    queue<node> p;
    node cur,next;
    memset(mark,0,sizeof(mark));
    cur.cen=0;
    cur.x=0;
    cur.y=0;
    cur.step=0;
//    memset(mark,0,sizeof(mark));
p.push(cur);
    mark[0][0][0]=1;
//    if(cur.cen==cen0&&cur.x==xx&&cur.y==yy)
//        cout<<"YES";
//    if(cur.x==xx&&cur.y==yy)
    //    return cur.step;
//    p.push(cur);
    while(!p.empty())
    {
        cur=p.front();
        p.pop();
        for(int i=0;i<4;i++)
        {
            next.x=cur.x+dist[i][0];
            next.y=cur.y+dist[i][1];
            next.cen=cur.cen;
        if(next.x<0||next.y<0||next.x>=n||next.y>=m)
            continue;
        if(map1[next.cen][next.x][next.y]=='*'||mark[next.cen][next.x][next.y])
            continue;
            if(map1[next.cen][next.x][next.y]=='#')
            {
            next.cen=!next.cen;
        //        if(map1[next.cen][next.x][next.y]=='*')
                //    return -1;
        //        continue;
        //    }
            if(mark[next.cen][next.x][next.y])
                continue;
            }
        
                if(map1[next.cen][next.x][next.y]=='P')
                    return cur.step+1;
                next.step=cur.step+1;
                mark[next.cen][next.x][next.y]=1;
                p.push(next);
        }
    }
    return -1;
}


int main()
{
    int Case;
    int i,j,z,k;
    //int n,m,t;
    cin>>Case;
    while(Case--)
    {
        cin>>n>>m>>t;
        //memset(mark,0,sizeof(mark));
        memset(map1,0,sizeof(map1));
        for(k=0;k<2;k++)
        {
            for(i=0;i<n;i++)
                scanf("%s",map1[k][i]);
                if(!k)
                    getchar();
        }
                judge();
//    bfs();
        int ans=bfs();
        //cout<<ans;
        if(ans==-1||ans>t)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
    }
return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值