2011-10-28 10:09
题目:http://poj.org/problem?id=1753题意:在一个4*4的方格阵里,每格里有一个一面白一面黑的棋子,初始状态由输入给出。游戏开始后,每次选择16格中的任何一个,然后将它以及它周围紧相邻的4个棋子翻转(超出边缘的不计)。游戏的目的是将所有色块翻成同一种颜色。问能不能达到游戏目的,如果能输出最少需要的翻拍次数。解法:bfs枚举每种情况。BYR论坛算法版给出的分类是枚举,但这题枚举要采取广搜策略。另外,注意到一共只有16个格,因此可以用一个16位的int存储状态,这样内存就不会超。存储每个状态是否被访问过可以直接用一个2^16个元素的flag数组完成。模拟翻牌过程用位运算即可。代码: Source CodeProblem: 1753 User: gp2593Memory: 1120K Time: 32MSLanguage: GCC Result: Accepted * Source Code #include<stdio.h> #include<stdlib.h> typedef struct node { int box; int time; int max; }NODE; turn(int bo,int positio) { int k,t; t=1<<positio; bo=bo^t; if(positio+4<=15) { k=t<<4; bo=bo^k; } if(positio-4>=0) { k=t>>4; bo=bo^k; } if(positio%4!=0) { k=t>>1; bo=bo^k; } if(positio%4!=3) { k=t<<1; bo=bo^k; […]