[HAOI2008]移动玩具 棋盘游戏

题目网址:https://www.luogu.org/problemnew/show/P4289

当看到只有0,1并且棋盘大小为4*4时,直接想到bfs+状态压缩

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<queue>
  7 using namespace std;
  8 inline long long read()
  9 {
 10     long long f=1,ans=0;char c;
 11     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
 12     while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
 13     return ans*f;
 14 }
 15 long long book[121220];
 16 struct node{
 17     long long a[5][5];
 18     long long minn;
 19     long long getkey()
 20     {
 21         long long sum=0,f=1;
 22         for(long long i=1;i<=4;i++)
 23         {
 24             for(long long j=1;j<=4;j++)
 25             {
 26 //                long long ans=0;
 27 //                for(long long z=(i-1)*4+j;z<=16;z++) 
 28 //                {
 29 //                    if(z%4==0) 
 30 //                        if(a[(z+3)/4][4]==1) ans++;
 31 //                    if(a[(z+3)/4][z%4]==1) ans++;
 32 //                }
 33 //                sum+=ans*f;
 34 //                f=f*2;
 35                 sum+=a[i][j]*f;
 36                 f*=2;
 37             }
 38         }
 39         return sum;
 40     }
 41 };
 42 long long p[5][5];
 43 long long dx[4]={1,-1,0,0};
 44 long long dy[4]={0,0,1,-1};
 45 char str;
 46 int main()
 47 {
 48 //    freopen("game.in","r",stdin);
 49 //    freopen("game.out","w",stdout);
 50     node ss;
 51     for(long long i=1;i<=4;i++)
 52         for(long long j=1;j<=4;j++) 
 53         {
 54             cin>>str;
 55             ss.a[i][j]=str-'0';
 56         }
 57     ss.minn=0;
 58     node bz;
 59     for(long long i=1;i<=4;i++)
 60         for(long long j=1;j<=4;j++)
 61         {
 62             cin>>str;
 63             bz.a[i][j]=str-'0';
 64         }
 65     long long check=bz.getkey();
 66     queue<node> que;
 67     que.push(ss);
 68 //    cout<<ss.getkey()<<" "<<bz.getkey();
 69     while(!que.empty())
 70     {    
 71         node sry=que.front();que.pop();
 72 //        cout<<sry.getkey()<<endl;
 73 //        for(long long i=1;i<=4;i++)
 74 //            {
 75 //                for(long long j=1;j<=4;j++) cout<<sry.a[i][j];
 76 //                cout<<endl;
 77 //            }
 78 //            system("pause");
 79     
 80         if(sry.getkey()==check)
 81         {
 82             cout<<sry.minn;return 0;
 83         }
 84         if(book[sry.getkey()]==0)
 85         {
 86 //            cout<<endl<<endl;
 87 //            for(long long i=1;i<=4;i++)
 88 //            {
 89 //                for(long long j=1;j<=4;j++) cout<<sry.a[i][j];
 90 //                cout<<endl;
 91 //            }
 92 //            system("pause");
 93             book[sry.getkey()]=1;
 94             for(long long i=1;i<=4;i++)
 95             {
 96                 for(long long j=1;j<=4;j++)
 97                 {
 98                     for(long long k=0;k<4;k++)
 99                     {
100                         long long xx=i+dx[k],yy=j+dy[k];
101                 //        cout<<i<<" "<<j<<" "<<xx<<" "<<yy<<endl;
102                          if(xx>=1&&xx<=4&&yy>=1&&yy<=4)
103                         {
104                             node sss=sry;
105                             swap(sss.a[i][j],sss.a[xx][yy]);
106                             sss.minn=sry.minn+1;
107                             que.push(sss);
108                         }
109                     }
110                 }
111             }
112         }
113         
114     }
115     return 0;
116 }

猜你喜欢

转载自www.cnblogs.com/si-rui-yang/p/9343546.html