• POJ 1753 枚举二进制+BFS


    搜了一下枚举的题 网上说这题特别经典 这是参考别人的代码,做个模板,运用二进制来保存棋盘,但一旦棋盘规模增大这种算法还是不行,再研究一下DFS的算法。

    #include <iostream>
     #include <queue>
    
      using namespace std;
    
      int step[65535];  //记录步骤
     bool flag[65535];  //防止重复搜索
    
     unsigned short qState[65535]; //搜索的状态,正好可以用一个16位的无符号短整形表示
     int rear = 0; //队列尾指针
     int top = 0; //队列头指针
    
     ///初始化:读入棋盘初始状态并把它转化为整数存入队列头,黑的位为1白的为0
     void Init()
     {
         unsigned short temp = 0;
         char c;
    
         for(int i=0; i < 4; i++)
             for(int j = 0; j < 4; j++)
             {
                 cin>>c;
                 if('b' == c)
                     temp |= (1<<(i*4+j));
             }
    
         qState[rear++] = temp;
         flag[temp]  = true;
     }
    
     ///翻转一个棋子并按规则对齐周围棋子附加影响
     unsigned short move(unsigned short state, int i)
     {
         unsigned short temp=0;
         temp |= (1<<i);
         if((i+1)%4 != 0) //右,且不在最右边
             temp |= (1<<(i+1));
         if(i%4 != 0) //左,且不在最左边
             temp |= (1<<(i-1));
         if(i+4 < 16) //下
             temp |= (1<<(i+4));
         if(i-4 >= 0) //上
             temp |= (1<<(i-4));
    
         return (state ^ temp);
     }
    
     //广度优先搜索,从队列中循环取出状态,并把翻转16次(即所有情况),一旦发现满足要求的立即停止,否则加入队列
     bool BFS()
     {
         while(rear > top)
         {
             unsigned short state = qState[top++];
             //qState.pop();
             for(int i=0; i < 16; i++)
             {
                 unsigned short temp;
                 temp = move(state,i);
                 if(0 == state || 65535 == state)
                 {
                     cout<<step[state];
                     return true;
                 }
                 else if(!flag[temp]) //防止重复搜索
                 {
                     //qState.push(temp);
                     qState[rear++] = temp;
                     flag[temp] = true;
                     step[temp] = step[state]+1;
                 }
             }
         }
    
         return false;
     }
    
     int main(void)
     {
    
         Init();
         if(!BFS()) cout<<"Impossible";
    
         char c;
         cin>>c;
     }
    

  • 相关阅读:
    SQL中top使用方法
    event.keyCode 事件属性
    A Novel Multi-label Classification Based on PCA and ML-KNN
    Android 浏览器开发WebView setBlockNetworkImage本末
    ASIHTTPRequest 对GET POST 请求简包
    九度OJ 1177 查找 (模拟)
    【Java GUI】Java GUI基金会
    iOS开展-clang: error: unknown argument: &#39;-websockets&#39;解决方案
    java学习笔记2015-6-6
    oracle 选择最频繁出现之前,5文章数据
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134221.html
Copyright © 2020-2023  润新知