poj 1753 解题报告
来源:互联网 发布:知乎765心理学综合 编辑:程序博客网 时间:2024/05/22 03:31
题目描述:
4*4棋盘内有黑(b:black)白(w:white)两色的棋子,用bw表示颜色,选择其中一个反转后,自己和自己上下左右四个方向的棋子均变色,最少反转次数使棋盘全白或全黑。
用户四个一行输入,输入完毕后,打印最少反转次数,不能则打印Impossible
算法分析:
广度搜索+枚举+位运算
一个棋子有两种情况,16个棋子,即棋盘有2的十六次方种情况,即65536,正好一个短整形,所以想到用一个短整形记录棋盘情况,16个位对应棋盘16格。
广度搜索使用非递归模式,速度快,用队列实现,元素短整形。
全部遍历一遍,剪枝掉重复搜索的情况。
(参考了大神的做法)
程序代码:
#include <iostream>using namespace std;#define MAX 65535unsigned short myqueue[MAX];//用‘位’保存状态的数组int myrear = 0, mytop = 0;//头尾指针bool flag[MAX];//是否出现过int num[MAX];//记录翻牌次数void init();unsigned short change(unsigned now, int i);bool bfs();int main(int argc, char *argv[]){init();if (!bfs()) cout << "Impossible";return 0;}void init(){unsigned short temp = 0;char c;for ( int i = 0; i < 16; i++) { cin >> c; if (c == 'b') temp |= (1<<i); }myqueue[myrear++] = temp;flag[temp] = true;}unsigned short change(unsigned now, 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 >= 0)//不是最上边 temp |= (1<<(i-4));if (i+4 < 16)//不是最下边 temp |= (1<<(i+4));return now ^ temp;}bool bfs(){while (myrear > mytop){unsigned short former = myqueue[mytop++];for ( int i = 0; i < 16; i++){unsigned short temp = change(former, i);if (former == 0 || former == 65535){cout << num[former];return true;}else if (!flag[temp])//剪枝,防重搜索{myqueue[myrear++] = temp;flag[temp] = true;num[temp] = num[former]+1;}}}return false;}
- POJ-1753解题报告
- poj 1753 解题报告
- POJ 1753 解题报告
- POJ 1753 POJ 2965 解题报告
- poj数百篇解题报告
- poj 1141解题报告
- poj 1001解题报告
- poj 1011 解题报告
- poj 1087 解题报告
- poj 2153解题报告
- poj 2051解题报告
- POJ 1167 解题报告
- poj 1026 解题报告
- POJ 1077 解题报告
- POJ 1042 解题报告
- POJ 1095 解题报告
- POJ 1159解题报告
- poj 2312解题报告
- 2011斯坦福大学iOS应用开发教程学习笔记(第六课)故事版
- 一封程序员的情书,写的有点水平~
- 拷贝构造函数与赋值运算符的区别
- android:数据存储和访问
- 国内IT行业技术会
- poj 1753 解题报告
- 正则表达式(一)获得特定字符
- 计算机图形学 -- 变换之旋转一 [金字塔旋转] [各种详解哦]
- 自由派:甘愿被洋奴三炮绑架
- JavaScript jQuery (1) 入门
- 网页上播放flv
- Eclipse快捷键大全
- 深刻理解Python中的元类(metaclass)
- 怎么找到android系统input命令的实现代码