时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
木乃伊地下宫殿是一个6行6列的迷宫。作为敢到木乃伊地下宫殿里去探险的你,有没有跟木乃伊抓迷藏的心理准备呵!游戏在木乃伊所在的迷宫里展开,任务就是尽快赶到出口。你一次只能走一步,而木乃伊可以走两步,但木乃伊是很笨的,他总是先尽量跟你达到同一列,如果已经是同一列了,他才会像你走来,有墙的地方人和木乃伊都不能过,你可以利用障碍物牵制住木乃伊。
输入:
先输入墙的数量n,然后在后续的n行里每行有3个数表示一堵墙,3个数分别为格子的行、列和墙的位置(0表示这个格子的下方是墙,1表示这个格子的右方是墙),再下来的3行每行2个数,分别表示木乃伊、人还有出口的位置。
输出:
如果能安全逃生则输出Yes,否则输出No,答案占一行。
输入样例:
5
0 0 0
1 1 1
1 4 1
3 4 1
4 3 0
3 3
3 1
5 5
输出样例:
No
#include <iostream>
#include <math.h>
#include <queue>
int ma[6][6],rr=3,rc=1,mr=3,mc=3,cr=5,cc=5,s=0,f=0,num[6][6][6][6],b[4][2]={
0,1,
0,-1,
1,0,
-1,0
};
using namespace std;
struct mu{
int rrow;
int rcol;
int mrow;
int mcol;
};
int isGo(mu m,int i){
if(i==0){
if(ma[m.rrow][m.rcol]==2)
return 0;
}
if(i==2){
if(ma[m.rrow][m.rcol]==1){
return 0;
}
}
return 1;
}
mu go(mu m,int i){
m.rrow+=b[i][0];
m.rcol+=b[i][1];
return m;
}
mu mgo(mu m){
int n=2;
while(n!=0){
n--;
if(m.rcol>m.mcol){
if(ma[m.mrow][m.mcol]!=2)
m.mcol++;
}
else{
if(m.rcol<m.mcol){
m.mcol--;
}
else {
if(m.rcol==m.mcol){
if(m.mrow<m.rrow)
{ if(ma[m.mrow][m.mcol]!=1)
m.mrow++;
}
else{
if(m.mrow>m.rrow){
m.mrow--;
}
else{
if(m.mrow==m.rrow)
s=1;
}
}
}
}
}
}
return m;
}
int isAim(mu m){
if(m.rrow==cr && m.rcol==cc)
return 1;
else
return 0;
}
int iskeyi(mu m){
if(m.rrow<6 && m.rrow>=0 && m.rcol<6 && m.rcol>=0)
return 1;
else
return 0;
}
int isSafe(mu m){
if(m.mcol==m.rcol && m.mrow==m.rrow)
return 0;
else
return 1;
}
int isNew(mu m){
if(num[m.rrow][m.rcol][m.mrow][m.mcol]==1)
return 0;
else
return 1;
}
void fd(){
mu fir,m,newm;
queue<mu> que;
int i;
fir.rcol=rc;
fir.rrow=rr;
fir.mrow=mr;
fir.mcol=mc;
que.push(fir);
while(!que.empty()){
m=que.front();
que.pop();
for(i=0;i<4;i++){
if(isGo(m,i)==0)
continue;
newm=go(m,i);
if(isAim(newm)==1){
f=1;
return;
}
if(iskeyi(newm)==1){
newm=mgo(newm);
if(isSafe(newm)==1){
if(isNew(newm)==1){
num[newm.rrow][newm.rcol][newm.mrow][newm.mcol]=1;
que.push(newm);
}
}
}
}
}
}
int main()
{
int i,n,a,b,c;
cin>>n;
for(i=0;i<n;i++){
cin>>a>>b>>c;
if(c==0)
ma[a][b]=2;
else
ma[a][b]=1;
}
cin>>mr>>mc;
cin>>rr>>rc;
cin>>cr>>cc;
fd();
if(rr==cr && rc==cc)
f=1;
if(mr==rr && mc==rc)
f=0;
if(f==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
return 0;
}