居然是一道WF题,虽然是很早的,但也超有成就感啊!!
4维判重,分别是x,y坐标和骰子上面和骰子前面的号码。
很水,拿个骰子或者纸盒比划下就好了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 1000000
struct node
{
int x,y;
int up,to;
}q[MAXN],st;
int fa[MAXN];
bool vis[11][11][7][7];
int map[11][11];
int dir[7][7][4];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int right[7][7];
int n,m;
bool isok(int up,int x,int y)
{
if(!(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y])) return false;
if(map[x][y]==-1) return true;
if(map[x][y]!=up) return false;
return true;
}
void change(node &tt,int d)
{
if(d==0)
{
int tmp=tt.up;
tt.up=tt.to;
tt.to=7-tmp;
}
else if(d==1)
{
int tmp=tt.to;
tt.to=tt.up;
tt.up=7-tmp;
}
else if(d==2)
{
tt.up=right[tt.up][tt.to];
}
else if(d==3)
{
tt.up=7-right[tt.up][tt.to];
}
}
int num;
void print(int k)
{
if(k==0) return;
print(fa[k]);
num++;
if(num!=9) printf(",(%d,%d)",q[k].x,q[k].y);
else {printf(",\n (%d,%d)",q[k].x,q[k].y);num=0;}
}
void bfs()
{
int rear=0,front=0;
node tmp,tt;
fa[0]=-1;
q[rear++]=st;
while(front<rear)
{
tmp=q[front];
for(int i=0;i<4;i++)
{
int nx=tmp.x+dx[i];
int ny=tmp.y+dy[i];
if(isok(tmp.up,nx,ny))
{
tt=tmp;
tt.x=nx;
tt.y=ny;
change(tt,i);
if(!vis[tt.x][tt.y][tt.up][tt.to])
{
fa[rear]=front;
q[rear++]=tt;
if(tt.x==st.x&&tt.y==st.y)
{
printf(" (%d,%d)",st.x,st.y);
print(rear-1);
putchar(10);
return;
}
vis[tt.x][tt.y][tt.up][tt.to]=1;
}
}
}
front++;
}
printf(" No Solution Possible\n");
}
int main()
{
right[1][2]=3;right[1][3]=5;right[1][4]=2;right[1][5]=4;
right[2][1]=4;right[2][3]=1;right[2][6]=3;right[2][4]=6;
right[3][1]=2;right[3][5]=1;right[3][6]=5;right[3][2]=6;
right[4][1]=5;right[4][2]=1;right[4][6]=2;right[4][5]=6;
right[5][1]=3;right[5][4]=1;right[5][6]=4;right[5][3]=6;
right[6][2]=4;right[6][3]=2;right[6][5]=3;right[6][4]=5;
char name[50];
while(scanf("%s",&name)&&strcmp(name,"END")!=0)
{
num=0;
scanf("%d%d%d%d%d%d",&n,&m,&st.x,&st.y,&st.up,&st.to);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
memset(vis,0,sizeof(vis));
puts(name);
bfs();
}
return 0;
}