zoukankan      html  css  js  c++  java
  • POJ 1753 bfs+位运算

    T_T ++运算符和+1不一样。(i+1)%4 忘带小括号了。bfs函数是bool 型,忘记返回false时的情况了。噢。。。。debug快哭了。。。。。。

    DESCRIPTION:
    求最少的步骤。使得棋盘上的棋子全黑或者全白。奇数次相当于1次。偶数次相当于不翻。

    bfs用来求解最优问题。主要用来求距离初始状态路径最短的路径。思想是暴力枚举+位运算。第一次做位运算的题目。。醉醉的啦。。。。。。

    附代码:

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #define end1 65535
    #define end2 0
    using namespace std;

    int step[end1];
    bool used[end1];
    unsigned short q[end1];
    int front = 0, rear = 0;

    void init()
    {
        char str;
        front = 0, rear = 0;
        unsigned short int begin = 0;
        for (int i=0; i<4; ++i)
        {
            for (int j=0; j<4; ++j)
            {
                cin >> str;
                if (str == 'b')
                   begin |= (1 << (i*4 + j));
            }
        }
        memset(step, 0, sizeof(step));
        memset(used, 0, sizeof(used));
        q[rear++] = begin;
        used[begin] = 1;
        step[begin] = 0;
    }

    unsigned short int move(unsigned short int state, int i)
    {
        unsigned short int 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);
    }

    bool bfs()
    {
         while (front < rear)
         {
             unsigned short state = q[front++];
             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 (!used[temp])
                 {
                     q[rear++] = temp;
                     used[temp] = true;
                     step[temp] = step[state]+1;
                 }
             }
         }
         return false;
    }

    int main()
    {
        init();
        if (!bfs())
            cout << "Impossible" ;

        char c;
        cin >> c;
        return 0;
    }

  • 相关阅读:
    zoj 1033 与其说是搜索,不如说是枚举
    hdu 4294 数学分析+搜索
    新的篇章
    Silverlight 利用DataGrid行加载事件动态控制行列显示
    (转)Excel中“不同的单元格格式太多”问题解决方法
    EasyUI tree的三种选中状态
    JS监听手机返回键
    Silverlight ComBox获取当前选中项的值
    DataGrdid 利用结果集反向转换成数据List
    silverlight 动态设置下拉框选中值
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4579040.html
Copyright © 2011-2022 走看看