首页 > 代码库 > zoj3675 BFS+状态压缩

zoj3675 BFS+状态压缩

#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int n;
int vis[10000000];
int mode1,mode2;
struct node
{
    int step,status;
};
void print(int x)
{
    int tmp=x%2;
    if (!(x==0 || x==1))
        print(x>>1);
        printf("%d",tmp);
}

int main()
{
    int i,j,m,n;
    char str[100];
    while (scanf("%d",&n)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        scanf("%s",str);
        scanf("%d",&m);
        //        printf("!!1");
        mode1=mode2=0;
        //printf("%s\n",str);
        for (i=0;str[i]!=\0;i++)
            mode1=(mode1<<1)+(str[i]==*?1:0);
        for (i=strlen(str)-1;i>=0;i--)
            mode2=(mode2<<1)+(str[i]==*?1:0);
        //        printf("mode1=%d\n",mode1);

        node tmp;
        tmp.step=0;
        tmp.status=0;
        int end=(1<<m)-1;
        queue<node> q;
        q.push(tmp);
        vis[tmp.status]=1;
        int full=0;
        for (i=0;i<m;i++)
            full=(full<<1)+1;
        node tmp2;
        int flag=1;
        while (!q.empty())
        {
            //            printf("@@@\n");
            tmp=q.front();
            q.pop();

            tmp.status=tmp.status<<(n-1);
            for (i=0;i<(n+m);i++)
            {
                int nw=((tmp.status|(mode1<<i))>>(n-1))&(full);
                //        printf("nw=");
                //        print(nw);
                //        printf("   %d\n",i);
                if (vis[nw]==0)
                {
                    vis[nw]=1;
                    tmp2.status=nw;
                    tmp2.step=tmp.step+1;
                    if (tmp2.status==end)
                    {
                        printf("%d\n",tmp2.step);
                        flag=0;
                        break;
                    }

                    q.push(tmp2);
                    //            printf("%d %d\n",tmp2.status,tmp2.step);
                }
            }
            if (!flag) break;
            for (i=0;i<(n+m);i++)
            {
                int nw=((tmp.status|(mode2<<i))>>(n-1))&(full);
                //            printf("nw=%d\n",nw);
                    //    printf("nw2=");
                    //    print(nw);
                    //    printf("   %d\n",i);
                if (vis[nw]==0)
                {
                    vis[nw]=1;
                    tmp2.status=nw;
                    tmp2.step=tmp.step+1;
                    if (tmp2.status==end)
                    {
                        printf("%d\n",tmp2.step);
                        flag=0;
                        break;
                    }
                    q.push(tmp2);
                    //                printf("%d %d\n",tmp2.status,tmp2.step);
                }
            }
            if (!flag)  break;
        }
        if (flag==1)
            printf("-1\n");
    }
    return 0;
}