poj 1753、2965枚举
题目大意:
一个4乘4的棋盘,上面放满了正反两面分别为黑和白的棋子,翻转一个棋子会让这个棋子上下左右的棋子也翻转,给定一个初始状态,求使所有棋子颜色相同所需的最少翻转次数。
解题思路:
先检查翻转0个棋子时是否所有棋子颜色一致,若不一致则翻转1个棋子,依次类推,若翻转某n个棋子后成功则n即为所求解,否则直到翻转16个棋子后仍未成功则输出“Impossible”。
翻转某n个棋子可用递归的方法,若递归函数中当前层翻转的是(i, j),则下一层递归函数从(i, j+ 1)开始选择,这样可以保证不重复。若j等于4(说明第i行已结束,)则应让j = 0; i++;到下一行中搜索。
用一个一维数组board[6]代表棋盘,其中board[i](i >= 1 && i <= 4)代表第i行,board[i]的二进制数最右边四位从左到右分别代表棋盘第i行的第1到4列。这样对棋子取反更方便。
#include <iostream>
#include <cstdio>
using namespace std; int board[];
int state[][] = { { , , , }, { , , , } }; void read() {
char c;
for (int i = ; i <= ; i++) {
for (int j = ; j <= ; j++) {
board[i] <<= ;
cin >> c;
if (c == 'b')
board[i] |= ;
}
}
} bool judge() {
if (board[] == && board[] == && board[] == && board[] == ||
board[] == && board[] == && board[] == && board[] == )
return true;
return false;
} void flip(int i, int j) {
i++; //下标从1开始
board[i] ^= state[][j];
board[i - ] ^= state[][j];
board[i + ] ^= state[][j];
} bool work(int n, int i, int j) {//还有n个棋子需翻转
if (n == )
return judge();
if (j == ) {
j = ; i++;
}
if ( - j + ( - i) * < n)
return false;
for (; i < ; i++) {
for (; j < ; j++) {
flip(i, j);
if(work(n - , i, j + ))
return true;
flip(i, j);
}
j = ;
}
return false;
} int main() {
read();
int i;
for (i = ; i <= ; i++) {
if (work(i, , ))
break;
}
if (i == )
cout << "Impossible" << endl;
else
cout << i << endl;
return ;
}
与上题基本相同,只不过需要一个栈来记录翻转的坐标。
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std; int board[];
int state[] = { , , , };
stack<int> s; void read() {
char c;
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
board[i] <<= ;
scanf_s("%c", &c);
if (c == '-')
board[i] |= ;
}
scanf_s("%c", &c); //读入换行符
}
} void change(int i, int j) {
for (int t = ; t < ; t++) {
if (t != i)
board[t] ^= state[j];
}
board[i] ^= ;
} bool judge() {
for (int i = ; i < ; i++) {
if (board[i] != )
return false;
}
return true;
} bool work(int n, int i, int j) { //n为还需转换的个数
if (n == )
return judge();
if (j == ) {
j = ;
i++;
}
if (n > ( - j) + ( - i) * )
return false;
for (; i < ; i++) {
for (; j < ; j++) {
change(i, j);
if (work(n - , i, j + )) {
s.push(j + ); s.push(i + );
return true;
}
change(i, j);
}
j = ;
}
return false;
} int main() {
read();
int i, n = ;
for (i = ; i <= ; i++) {
if (work(i, , ))
break;
}
printf("%d\n", i);
while (!s.empty()) {
printf("%d", s.top());
s.pop();
printf(" %d\n", s.top());
s.pop();
}
return ;
}
poj 1753、2965枚举的更多相关文章
- [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)
先列出题目: 1.POJ 1753 POJ 1753 Flip Game:http://poj.org/problem?id=1753 Sample Input bwwb bbwb bwwb bww ...
- poj 1753 2965
这两道题类似,前者翻转上下左右相邻的棋子,使得棋子同为黑或者同为白.后者翻转同行同列的所有开关,使得开关全被打开. poj 1753 题意:有一4x4棋盘,上面有16枚双面棋子(一面为黑,一面为白), ...
- poj—1753 (DFS+枚举)
...
- 枚举 POJ 1753 Flip Game
题目地址:http://poj.org/problem?id=1753 /* 这题几乎和POJ 2965一样,DFS函数都不用修改 只要修改一下change规则... 注意:是否初始已经ok了要先判断 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- POJ 1753 Flip Game(高斯消元+状压枚举)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45691 Accepted: 19590 Descr ...
- POJ 1753 Flip Game DFS枚举
看题传送门:http://poj.org/problem?id=1753 DFS枚举的应用. 基本上是参考大神的.... 学习学习.. #include<cstdio> #include& ...
- POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题
http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...
- poj 1873 凸包+枚举
The Fortified Forest Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6198 Accepted: 1 ...
- 穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753
下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A mes ...
随机推荐
- ThinkPHP5.0的助手函数汇总
load_trait:快速导入Traits,PHP5.5以上无需调用 /** * 快速导入Traits PHP5.5以上无需调用 * @param string $class trait库 * @pa ...
- 解决windows10活动历史记录删除问题
Windows10日常办公过程中系统会记录很多活动历史记录信息,我是不希望我的活动历史记录随时可以被别人查看,虽然电脑有设置密码,但是办公电脑还是习惯将历史记录删除掉,并且永远禁用windows10的 ...
- Java基础18-toString()方法、this关键字
1.toString()方法 在java中,所有对象都有toString()这个方法 创建类时没有定义toString方法输出对象时会输出哈希码值 它通常只是为了方便输出,比System.out.pr ...
- 里氏替换原则(Liskov Substitution Principle) LSP
using System; using System.Collections.Generic; using System.Text; namespace LiskovSubstitutionPrinc ...
- (转)详解Linux中SSH远程访问控制
详解Linux中SSH远程访问控制 原文:http://blog.51cto.com/dengqi/1260038 SSH:是一种安全通道协议,主要用来实现字符界面的远程登录,远程复制等功能(使用TC ...
- 更改CMD默认的初始路径
一直用CMD开启本地服务,每一次都得切换路径,有点尴尬.记录一下,修改CMD默认路径 1.打开注册表编辑器(WIN+R打开运行.输入regedit,或者直接找到路径,双击打开C:\Windows\re ...
- 牛客网Java刷题知识点之拥塞发生的主要原因、TCP拥塞控制、TCP流量控制、TCP拥塞控制的四大过程(慢启动、拥塞避免、快速重传、快速恢复)
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- 使用windows的BitLocker+VHD加密“文件夹”
进入磁盘管理 创建VHD,选定位置 初始化创建的虚拟盘,新建简单卷 给新的盘启用BitLocker 其他: 快速锁定:manage-bde.exe D: -lock -fd
- 设置ibus为默认输入法
/etc/profile 文件中编辑 export INPUT_METHOD="ibus"
- Win7 x86内核调试与TP反调试的研究
参考 这两天对某P双机调试的学习及成果 ,非常好的一篇分析贴. 本文在Win7 x86下的分析,在虚拟机中以/DEBUG模式启动TP游戏,系统会自动重启. 0x01 内核调试全局变量 根据软件调试 ...