题意:中文题目,容易看懂,之前把题意给理解错了,认为走进传输机可以选择传送或是不传送,看了题解才知道没得选,走进去就相当于传输,如果上下两层都是时空传输机,或是传送的目的地是墙壁,则不能走进传输机,前者会造成无限传送,后者会撞死。所以要禁止这种情况,将它们视作墙壁即可。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 20;
char map[2*maxn][2*maxn];
int d[2*maxn][2*maxn];
int Move[] = {0,1,0,-1,0}; //x,y+1 x+1,y x,y-1 x-1,y
int n,m;
struct node
{
int i,j;
node(int i,int j):i(i),j(j){
}
};
bool check(int i,int j)
{
return i>=0&&i<=2*n&&j>=0&&j<m;
}
void bfs(int ei,int ej)
{
queue<node> q;
q.push(node(0,0));
d[0][0]=0;
while(!q.empty())
{
int sz = q.size();
while(sz--)
{
node a = q.front();q.pop();
int di,dj;
di = a.i;dj = a.j;
if(map[di][dj]=='P')return;
// printf("%d %d\n",di,dj);
for(int i=0;i<4;i++)
{
int ci,cj;
ci = di+Move[i];
cj = dj+Move[i+1];
if(check(ci,cj)&&d[ci][cj]==-1&&(map[ci][cj]=='.'||map[ci][cj]=='P'))
{
d[ci][cj]=d[di][dj]+1;
q.push(node(ci,cj));
}
else if(check(ci,cj)&&ci<n&&d[ci+n+1][cj]==-1&&map[ci][cj]=='#')
{
d[ci+n+1][cj]=d[di][dj]+1;
d[ci][cj]=d[di][dj]+1;
q.push(node(ci+n+1,cj));
}
else if(check(ci,cj)&&ci>=n+1&&d[ci-n-1][cj]==-1&&map[ci][cj]=='#')
{
d[ci-n-1][cj]=d[di][dj]+1;
d[ci][cj]=d[di][dj]+1;
q.push(node(ci-n-1,cj));
}
}
}
}
}
int main()
{
int T,c;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&c);
int i,j,ei,ej;
i=j=0;
memset(d,-1,sizeof(d));
memset(map,0,sizeof(map));
getchar();
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='P')
{
ei=i;
ej=j;
}
}
getchar();
}
for(i=n+1;i<=2*n;i++)//第n行隔开
{
getchar();
for(j=0;j<m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='P')
{
ei=i;
ej=j;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
if(map[i][j]=='#'&&map[i+n+1][j]=='#')
{
map[i][j]=map[i+n+1][j]='*';
}
else if(map[i][j]=='#'&&map[i+n+1][j]=='*')
map[i][j]='*';
else if(map[i+n+1][j]=='#'&&map[i][j]=='*')
map[i+n+1][j]='*';
}
bfs(ei,ej);
if(d[ei][ej]<=c&&d[ei][ej]!=-1)
printf("YES\n");
else
printf("NO\n");
}
}
209




被折叠的 条评论
为什么被折叠?



