zoukankan      html  css  js  c++  java
  • POJ1753 解题报告

      很久没做ACM题了,最近又想做做,发现实力有待提高,这次做的题目不难,但也是在参考其他人的思路后做出来的,要继续努力。

     

      题目:POJ 1753  Flip Game:http://acm.pku.edu.cn/JudgeOnline/problem?id=1753

     

      学到的知识:1 BFS也可以用来求解最优问题,特别是在搜索问题的时候求解距离初始状态最短的路径,这个思想非常重要,要好好记住。

            2 枚举,这次用的是枚举方法,奇怪的是,我一开始用的是c++的stl中的bitset和queue,但是却会溢出。。。,按照常理顶多65535个长度,不过不知道队列支持多大的就是,后来改成数组来当队列用就可以了。

       

       感受:感觉做做ACM题对于训练思维和提升实际应用数据结构和算法的能力很有帮助,特别是数据结构,实际应用它和仅仅靠看书来对它进行理解完全是两码事,很多人说工作中几乎用不到算法和数据结构,对于这点我觉得那很有可能他们做得事都只设计很浅的层次,对计算机而言,真正的核心还是算法和数据结构,只有做到这个层次才能算深刻。

      

      AC代码:

      

    代码
    1 #include <iostream>
    2 #include <queue>
    3
    4  using namespace std;
    5
    6  int step[65535]; //记录步骤
    7 bool flag[65535]; //防止重复搜索
    8
    9 unsigned short qState[65535]; //搜索的状态,正好可以用一个16位的无符号短整形表示
    10 int rear = 0; //队列尾指针
    11 int top = 0; //队列头指针
    12
    13 ///初始化:读入棋盘初始状态并把它转化为整数存入队列头,黑的位为1白的为0
    14 void Init()
    15 {
    16 unsigned short temp = 0;
    17 char c;
    18
    19 for(int i=0; i < 4; i++)
    20 for(int j = 0; j < 4; j++)
    21 {
    22 cin>>c;
    23 if('b' == c)
    24 temp |= (1<<(i*4+j));
    25 }
    26
    27 qState[rear++] = temp;
    28 flag[temp] = true;
    29 }
    30
    31 ///翻转一个棋子并按规则对齐周围棋子附加影响
    32 unsigned short move(unsigned short state, int i)
    33 {
    34 unsigned short temp=0;
    35 temp |= (1<<i);
    36 if((i+1)%4 != 0) //右,且不在最右边
    37 temp |= (1<<(i+1));
    38 if(i%4 != 0) //左,且不在最左边
    39 temp |= (1<<(i-1));
    40 if(i+4 < 16) //
    41 temp |= (1<<(i+4));
    42 if(i-4 >= 0) //
    43 temp |= (1<<(i-4));
    44
    45 return (state ^ temp);
    46 }
    47
    48 //广度优先搜索,从队列中循环取出状态,并把翻转16次(即所有情况),一旦发现满足要求的立即停止,否则加入队列
    49 bool BFS()
    50 {
    51 while(rear > top)
    52 {
    53 unsigned short state = qState[top++];
    54 //qState.pop();
    55 for(int i=0; i < 16; i++)
    56 {
    57 unsigned short temp;
    58 temp = move(state,i);
    59 if(0 == state || 65535 == state)
    60 {
    61 cout<<step[state];
    62 return true;
    63 }
    64 else if(!flag[temp]) //防止重复搜索
    65 {
    66 //qState.push(temp);
    67 qState[rear++] = temp;
    68 flag[temp] = true;
    69 step[temp] = step[state]+1;
    70 }
    71 }
    72 }
    73
    74 return false;
    75 }
    76
    77 int main(void)
    78 {
    79
    80 Init();
    81 if(!BFS()) cout<<"Impossible";
    82
    83 char c;
    84 cin>>c;
    85 }

      

  • 相关阅读:
    素数路径Prime Path POJ3126 素数,BFS
    Fliptile POJ3279 DFS
    Find the Multiple POJ1426
    洗牌Shuffle'm Up POJ3087 模拟
    棋盘问题 POJ1321 DFS
    抓住那只牛!Catch That Cow POJ3278 BFS
    Dungeon Master POJ2251 三维BFS
    Splitting into digits CodeForce#1104A
    Ubuntu下手动安装Nvidia显卡驱动
    最大连续子序列和
  • 原文地址:https://www.cnblogs.com/HappyAngel/p/1734108.html
Copyright © 2011-2022 走看看