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 ...
随机推荐
- PHPExcel 读取的几个例子
1.使用 PHPExcel_IOFactory 读取文件 $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); 2.使用一个特定的读取类,读 ...
- python--交互器,编译器
1在写python的时候调交互器的作用 唯一作用:调试代码 2.编译器
- base64的python实现
写了一个函数,自己按照base64的规则转换一个字符串. # /usr/bin/python # encoding: utf-8 base64_table = ['A', 'B', 'C', 'D', ...
- centos yum安装高版本php,apache,mysql
1.检查当前安装的PHP包 yum list installed | grep php 或者 yum list installed php* 如果要删除,可执行 yum remove php.x8 ...
- Git本地缓存问题 修改密码后git无法拉取
问题描述:使用正确的用户名和密码可以登录到Git代码仓库,但是在本地无法使用Git bash命令行的方式拉取代码. 问题原因:第一次使用Git bash方式拉取代码时,会根据当前的用户和密码生成一串. ...
- 【3dsMax安装失败,如何卸载、安装3dMax 2016?】
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- (转) 来自: http://man.linuxde.net/tee
tee命令文件过滤分割与合并 tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin.简单的说就是把数据重定向到给定文件和屏幕上. 存在缓存机制,每1024个 ...
- PHP Mongodb API参考
<?php /*** Mongodb类** examples: * $mongo = new HMongodb("127.0.0.1:11223"); * $mongo-&g ...
- java ReentrantLock Condition
sychronized.wait.notify.notifyAll.sleep 在多线程环境下,为了防止多个线程同时调用同一个方法.修改同一份变量,造成数据读取结果混乱,可以使用synchronize ...
- 安装 VS 2015 Update 2 + Windows SDK Tools 1.3.1 + Windows SDK 10586.212 后提示找不到 10586.0 SDK 问题的解决方法
将 Visual Studio 2015 升级到 Update 2,并安装 Windows SDK Tools 1.3.1 和 Windows SDK 10586.212 后,有可能造成原本已安装的 ...