您的位置:首页 > 其它

HDU 3713 Double Maze

2012-02-01 00:28 288 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3713

BFS

我的代码

#include <stdio.h>
#include <string.h>
const int N=10000;
const int dx[4]={0,1,0,-1};
const int dy[4]={-1,0,1,0};
const char dd[5]="LDRU";
int maze1[10][10],maze2[10][10];
int vis
,dir
,fa
,q
,dir2
;
int bfs(int x1,int y1,int x2,int y2)
{
memset(q,0,sizeof(0));
int u=x1*1000+y1*100+x2*10+y2;
vis[u]=1; fa[u]=0;
int front=0,rear=1;
q[1]=u;
while (front<rear)
{
u=q[++front];
x1=u/1000; y1=u/100%10;
x2=u/10%10; y2=u%10;
if (((maze1[x1][y1]&maze2[x2][y2])>>6)&1) return u;
int d2,d,nx1,ny1,nx2,ny2;
const int dd[4]={1,0,2,3};
for (d2=0;d2<4;d2++)
{
d=dd[d2];
nx1=x1; ny1=y1;
if (((maze1[x1][y1]>>d)&1)==0) {nx1+=dx[d]; ny1+=dy[d];}
nx2=x2; ny2=y2;
if (((maze2[x2][y2]>>d)&1)==0) {nx2+=dx[d]; ny2+=dy[d];}
int v=nx1*1000+ny1*100+nx2*10+ny2;
int w=maze1[nx1][ny1]&maze2[nx2][ny2];
if (vis[v] || ((w>>4)&1)==0) continue;
vis[v]=1; dir[v]=d; fa[v]=u;
q[++rear]=v;
}
}
return -1;
}
int main()
{
int T,i,j;
scanf("%d",&T);
memset(maze2,0,sizeof(maze2));
for (i=1;i<=6;i++)
for (j=1;j<=6;j++) scanf("%d",&maze2[i][j]);
T--;
while (T--)
{
memcpy(maze1,maze2,sizeof(maze1));
for (i=1;i<=6;i++)
for (j=1;j<=6;j++) scanf("%d",&maze2[i][j]);
memset(vis,0,sizeof(vis));
memset(dir,0,sizeof(dir));
memset(fa,0,sizeof(fa));
int x1,y1,x2,y2;
for (i=1;i<=6;i++) for (j=1;j<=6;j++)
if ((maze1[i][j]>>5)&1) {x1=i; y1=j;}
for (i=1;i<=6;i++) for (j=1;j<=6;j++)
if ((maze2[i][j]>>5)&1) {x2=i; y2=j;}
int e=bfs(x1,y1,x2,y2);
if (e==-1) {printf("-1\n"); continue;}
int m=0;
for (i=e;i;i=fa[i]) dir2[++m]=dir[i]; m--;
for (i=m;i;i--) printf("%c",dd[dir2[i]]);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: