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 ...
随机推荐
- vux构建的项目打包成app出的一些问题
1.static里面能放一些外部的插件,css可以放static,引用的时候按照相对路径写, less不可以,因为放在static里面的文件不会经过webpack的处理,所以也就不会编译成css,所以 ...
- 【记录】SQL注入过滤源码分享
$id=check_addslashes($_GET['id']);$id= preg_replace('/o*r/i',"", $id); //strip out OR (non ...
- Python入门笔记——(1)数字与表达式
一.算术运算 整除:// 取余:% 乘方:** (a ** b = pow(a, b)) 十六进制表示:0x...,八进制表示0... round(x [, n]):对x从小数点第n位取四舍五入结果, ...
- Python Excel操作库
xlrd:支持.xls..xlsx读 xlwt:只支持.xls写 xlutils:只支持.xls读写 依赖于xlrd和xlwt xlwings:支持.xls读,.xlsx读写 可以实现Excel和Py ...
- 《阿里如何实现秒级百万TPS?搜索离线大数据平台大数据平台架构解读》读后感
在使用淘宝时发现搜索框很神奇,它可以将将我们想要的商品全部查询出来,但是我们并感觉不到数据库查询的过程,速度很快.通过阅读这篇文章让我知道了搜索框背后包含着很多技术,对我以后的学习可能很有借鉴. 平时 ...
- (转)shell--read命令的选项及用法
shell--read命令 原文:https://www.cnblogs.com/lottu/p/3962921.html http://blog.csdn.net/skdkjzz/article/d ...
- webservice 注解介绍
JAX-WS 注释 “基于 XML 的 Web Service 的 Java API”(JAX-WS)通过使用注释来指定与 Web Service 实现相关联的元数据以及简化 Web Service ...
- 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类
不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...
- nutz框架使用记录之Cnd.wrap
这是对Cnd.wrap 官方用法 , 直接硬编码 , [JAVA]List<Person> crowd = dao.query(Person.class, Cnd.wrap("n ...
- 如何去除表单元素获得焦点时的外边框:outline (轮廓)
我们在做制作表单页面时,经常会需要消除表单元素带来的边框,这时候我们需要用到两个属性: 1.表单元素未激活状态下的边框,不实现边框: border:none; 2.表单元素获得焦点时的轮廓,隐藏轮廓: ...