poj 1872 A Dicey Problem (bfs+WordFinal题)

羡慕居然是一道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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值