zoukankan      html  css  js  c++  java
  • 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;
     }
    

  • 相关阅读:
    理解javascript 对象,原型对象、闭包
    JSON数据理解
    css 盒模型相关样式
    神奇的CSS3选择器
    设计模式六大原则
    java反射机制性能优化
    一份关于jvm内存调优及原理的学习笔记
    浅谈http请求数据分析
    Apache+Tomcat部署负载均衡(或集群)
    同台电脑部署多组Tomcat负载均衡(或集群)
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134221.html
Copyright © 2011-2022 走看看