zoukankan      html  css  js  c++  java
  • 迷宫寻宝(一) ---- 状态压缩

    基础的状态压缩  

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

      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
    ");
    102         else
    103             printf("NO
    ");
    104     }
    105     return 0;
    106 }
  • 相关阅读:
    该伙伴事务管理器已经禁止了它对远程/网络事务的支持
    HDU 4883 TIANKENG’s restaurant (贪心)
    Android:创建可穿戴应用
    debian支持ll命令
    mongodb进阶一之高级查询
    Hadoop之——又一次格式化hdfs系统的方法
    J2EE的13个规范之(二) JDBC 及其使用
    2015欧冠决赛--脑力劳动结硕果
    运行计划之误区,为什么COST非常小,SQL却跑得非常慢?
    QVariant与自定义数据类型转换的方法
  • 原文地址:https://www.cnblogs.com/A-FM/p/5349495.html
Copyright © 2011-2022 走看看