HDU-2102-A计划
http://acm.hdu.edu.cn/showproblem.php?pid=2102
今天要到学校的第一天,天气还是挺热的,我的暑假也算是结束了,在家的一个月里,看了一部电视剧《浮沉》,挺喜欢白百合的,也深刻体会了白领阶级的辛酸;还有就是把《闪客2》这个号称是横板鬼泣的游戏玩通关了,自己还是钟情于单机游戏,不多说了
这题是BFS,注意处理#即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
int n1,n2,t;
int visit[2][12][12];
char map[2][12][12];
struct node
{
int k;
int x;
int y;
int time;
};
int go(int k,int x,int y)
{
if(0<=x&&x<n1&&0<=y&&y<n2&&map[k][x][y]!='*')
return 1;
return 0;
}
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void bfs(node s1,node s2,int t)
{
queue<node>q;
node st,ed;
int i;
memset(visit,0,sizeof(visit));
st.k=s1.k,st.x=s1.x,st.y=s1.y;
st.time=0;
visit[st.k][st.x][st.y]=1;
q.push(st);
while(!q.empty())
{
st=q.front();
q.pop();
if(st.k==s2.k&&st.x==s2.x&&st.y==s2.y&&st.time<=t)
{
printf("YES\n");
return;
}
if(st.time>t) //刚开始忘了这个结果超时
{
printf("NO\n");
return;
}
for(i=0;i<4;i++)
{
ed.k=st.k;
ed.x=st.x+dir[i][0];
ed.y=st.y+dir[i][1];
if(!visit[ed.k][ed.x][ed.y]&&go(ed.k,ed.x,ed.y))
{
if(map[ed.k][ed.x][ed.y]=='#')
{
if(ed.k==0)
ed.k=1;
else
ed.k=0;
if(map[ed.k][ed.x][ed.y]=='#'||map[ed.k][ed.x][ed.y]=='*') //死循环或撞墙
continue;
}
visit[ed.k][ed.x][ed.y]=1;
ed.time=st.time+1;
q.push(ed);
}
}
}
printf("NO\n");
}
int main()
{
int c;
int k,i,j;
node s1,s2;
scanf("%d",&c);
while(c--)
{
scanf("%d%d%d",&n1,&n2,&t);
for(k=0;k<2;k++)
for(i=0;i<n1;i++)
scanf("%s",map[k][i]);
for(k=0;k<2;k++)
for(i=0;i<n1;i++)
for(j=0;j<n2;j++)
{
if(map[k][i][j]=='S')
{
s1.k=k;
s1.x=i;
s1.y=j;
}
else if(map[k][i][j]=='P')
{
s2.k=k;
s2.x=i;
s2.y=j;
}
}
bfs(s1,s2,t);
}
return 0;
}