poj 2965 The Pilots Brothers' refrigerator

//位压缩加搜索枚举,用pre记录其前驱

#include<stdio.h>
#include<string.h>
#define N 100000
struct node
{
    int x,y,num,pre,step;
}p[N*4];
struct nn
{
    int x,y;
}g[N*4];
char str[10][10];
int vis[N];
int d[16]=
{
    0xf888,0xf444,0xf222,0xf111,
    0x8f88,0x4f44,0x2f22,0x1f11,
    0x88f8,0x44f4,0x22f2,0x11f1,
    0x888f,0x444f,0x222f,0x111f,
};

int bfs(int sum)
{
    int head=0,tail=0,i;
    p[head].num=sum;
    p[head].step=0;
    p[head].pre=0;
    tail++;
    while(head<tail)
    {
        int k=p[head].num;
        for(i=0;i<16;i++)
        {
            int x=k^d[i];

            if(vis[x]==0)
            {
                vis[x]=1;

                p[tail].num=x;
                p[tail].x=i/4;
                p[tail].y=i%4;
                p[tail].pre=head;
                p[tail].step=p[head].step+1;
                 if(x==0){  return tail;}
                 tail++;

            }
        }
        head++;
    }
    return 0;


}
int main()
{
    int i,j;
    memset(vis,0,sizeof(vis));
    for(i=0;i<4;i++)
    {
        scanf("%s",str[i]);
    }
    int sum=0;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            if(str[i][j]=='+')
            {
                sum<<=1;
                sum+=1;
            }
            else
            {
                sum<<=1;
            }
        }
    }

    if(sum==0){printf("0\n");return 0;}
    int ans=bfs(sum);

    printf("%d\n",p[ans].step);
    i=0;
    g[i].x=p[ans].x;
    g[i].y=p[ans].y;//注意这,可能只需一次就可以开锁
    while(p[ans].pre)
    {

        //printf("%d %d\n",p[ans].x,p[ans].y);
        i++;
        ans=p[ans].pre;
        if(ans==0)break;
        g[i].x=p[ans].x;
        g[i].y=p[ans].y;
    }

    for(;i>=0;i--)
    {
        printf("%d %d\n",g[i].x+1,g[i].y+1);
    }


}

  

原文地址:https://www.cnblogs.com/acSzz/p/2363638.html