迷宫寻宝 ---- 状态压缩

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迷宫寻宝 ---- 状态压缩相关的知识,希望对你有一定的参考价值。

技术分享

技术分享

基础的状态压缩  

记下来当前的改变 , 在下一次的时候 适当的利用上次搜索的结果  下面附上  渣渣代码

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<math.h>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<queue>
  7 #include<vector>
  8 #include<set>
  9 #include<stack>
 10 #include<string>
 11 #include<sstream>
 12 #include<map>
 13 #include<cctype>
 14 using namespace std;
 15 int c[7],n,m,b[4][2]={0,-1,0,1,-1,0,1,0},visited[22][22],flag;
 16 char a[22][22];
 17 struct node
 18 {
 19     int x,y;
 20 };
 21 queue<node>Q;
 22 bool check(int x,int y)
 23 {
 24     if(a[y][x]>=A&&a[y][x]<=E)  //如果是门  而且
 25     {
 26         if(c[a[y][x]-A]!=0)    //   钥匙不够的计划
 27             return false;
 28     }
 29     return true;
 30 }
 31 void BFS(int x,int y,int &mark)
 32 {
 33     node q={x,y};
 34     Q.push(q);
 35     while(!Q.empty())
 36     {
 37         node e=Q.front();
 38         Q.pop();
 39         for(int i=0;i<4;i++)
 40         {
 41             q.x=e.x+b[i][0],q.y=e.y+b[i][1];
 42             if(a[q.y][q.x]!=X&&q.x>=0&&q.x<m&&q.y>=0&&q.y<n&&!visited[q.y][q.x]&&check(q.x,q.y))
 43             {
 44                 visited[q.y][q.x]=1;
 45                 Q.push(q);
 46                 if(a[q.y][q.x]>=a&&a[q.y][q.x]<=e)
 47                 {
 48                     c[a[q.y][q.x]-a]--;
 49                     if(c[a[q.y][q.x]-a]==0)
 50                         mark++;
 51                     a[q.y][q.x]=.;
 52                 }
 53                 if(a[q.y][q.x]==G)
 54                     flag=1;
 55             }
 56         }
 57     }
 58 }
 59 int main()
 60 {
 61     int sx,sy;
 62     while(scanf("%d%d",&n,&m),(n||m))
 63     {
 64         memset(c,0,sizeof(c));
 65         for(int i=0;i<n;i++)
 66         {
 67             for(int j=0;j<m;j++)
 68             {
 69                 scanf(" %c",&a[i][j]);
 70                 if(a[i][j]==a)
 71                     c[0]++;
 72                 if(a[i][j]==b)
 73                     c[1]++;
 74                 if(a[i][j]==c)
 75                     c[2]++;
 76                 if(a[i][j]==d)
 77                     c[3]++;
 78                 if(a[i][j]==e)
 79                     c[4]++;
 80                 if(a[i][j]==S)
 81                 {
 82                     sx=j;
 83                     sy=i;
 84                 }
 85             }
 86         }
 87         memset(visited,0,sizeof(visited));
 88         visited[sy][sx]=1;
 89         int mark=1;
 90         flag=0;
 91         while(mark--)
 92         {
 93             while(!Q.empty())
 94                 Q.pop();
 95             BFS(sx,sy,mark);
 96             memset(visited,0,sizeof(visited));
 97             if(flag)
 98                 break;
 99         }
100         if(flag)
101             printf("YES\n");
102         else
103             printf("NO\n");
104     }
105     return 0;
106 }

 

以上是关于迷宫寻宝 ---- 状态压缩的主要内容,如果未能解决你的问题,请参考以下文章

uoj384 HNOI2018 寻宝游戏

迷宫寻宝

迷宫寻宝 BFS

状态压缩入门 P2622 关灯问题II

nyoj 82迷宫寻宝

nyoj 82 迷宫寻宝