poj 1753 2965
这两道题类似,前者翻转上下左右相邻的棋子,使得棋子同为黑或者同为白。后者翻转同行同列的所有开关,使得开关全被打开。
题意:有一4x4棋盘,上面有16枚双面棋子(一面为黑,一面为白), 当翻动一只棋子时,该棋子上下左右相邻的棋子也会同时翻面。以b代表黑面,w代表白面,给出一个棋盘状态, 问从该棋盘状态开始,使棋盘变成全黑或全白,至少需要翻转多少步
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int mp[5][5];
int step,flag;
int range()//遍历整个棋盘是否“清一色”
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(mp[i][j]!=mp[0][0])
return 0;
return 1;
}
void turn(int i,int j)//翻转(i,j)棋子,以及(i,j)周围的棋子
{
mp[i][j]=!mp[i][j];
if(i>0) mp[i-1][j]=!mp[i-1][j];
if(i<3) mp[i+1][j]=!mp[i+1][j];
if(j>0) mp[i][j-1]=!mp[i][j-1];
if(j<3) mp[i][j+1]=!mp[i][j+1];
}
int dfs(int i,int j,int k)
{
if(k==step){
flag = range();
return 0;
}
if(flag||i==4){
return 1;
}
turn(i,j);
if(j<3) dfs(i,j+1,k+1);//一行当中的所有列
else dfs(i+1,0,k+1);//下一行
turn(i,j);//回溯,翻回来
if(j<3) dfs(i,j+1,k);//下一个棋子继续dfs
else dfs(i+1,0,k);
return 0;
}
int main()
{
char str[5][5];
for(int i=0;i<4;i++)
cin>>str[i];
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(str[i][j]=='b') mp[i][j]=1;
else mp[i][j]=0;
for(step=0;step<=16;step++)
{
flag = 0;
dfs(0,0,0);//(x,y),step
if(flag) break;
}
if(flag) printf("%d\n",step);
else printf("Impossible\n");
return 0;
}
一个冰箱上有4*4共16个开关,改变任意一个开关的状态(即开变成关,关变成开)时,此开关的同一行、同一列所有的开关都会自动改变状态。要想打开冰箱,要所有开关全部打开才行。
输入:一个4×4的矩阵,+表示关闭,-表示打开;
输出:使冰箱打开所需要执行的最少操作次数,以及所操作的开关坐标。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int Max = 0x3f3f3f3f;
int mp[5][5];
char str[5][5];
int tx[20],ty[20],ansX[20],ansY[20],ans;
int range()//判断是否“清一色”
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(mp[i][j]==1)
return 0;
return 1;
}
void turn(int x,int y)//翻转同(i,j)同行同列的开关
{
for(int i=0;i<4;i++)
{
mp[x][i]=!mp[x][i];
mp[i][y]=!mp[i][y];
}
mp[x][y]=!mp[x][y];
}
void dfs(int x,int y,int step)
{
int check = range();
if(check==1){ //开关全打开(为0)
if(step<ans){
ans = step;
for(int i=0;i<step;i++){
ansX[i]=tx[i];
ansY[i]=ty[i];
}
}
return;
}
if(x>3||step>16) return;
turn(x,y);
tx[step]=x; ty[step]=y;
if(y<3) dfs(x,y+1,step+1);
else dfs(x+1,0,step+1);
turn(x,y);//回溯,翻回来
if(y<3) dfs(x,y+1,step);
else dfs(x+1,0,step);
return ;
}
int main()
{
for(int i=0;i<4;i++)
cin>>str[i];
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(str[i][j]=='+') mp[i][j]=1;
else mp[i][j]=0;
ans = Max;
dfs(0,0,0);//(x,y),step
cout<<ans<<endl;
for(int i=0;i<ans;i++)
printf("%d %d\n",ansX[i]+1,ansY[i]+1);
return 0;
}
递归的题总是要把人绕进去,特别是回溯那个地方。第二题还可以用其他的解法,解法很多,代码简单,但是数学不过关,看不懂,下次再看看。
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 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 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 1753 Flip Game(高斯消元+状压枚举)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45691 Accepted: 19590 Descr ...
- 穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753
下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A mes ...
- poj 1753、2965枚举
1753题目链接 题目大意: 一个4乘4的棋盘,上面放满了正反两面分别为黑和白的棋子,翻转一个棋子会让这个棋子上下左右的棋子也翻转,给定一个初始状态,求使所有棋子颜色相同所需的最少翻转次数. 解题思路 ...
- POJ 1753 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1753 题目大意:一堆格子,或白或白.每次可以把一个改变一个格子颜色,其上下左右四个格子颜色也改变.问最后使格子全部白或全部黑,求最小 ...
- poj 1753 Flip Game 枚举(bfs+状态压缩)
题目:http://poj.org/problem?id=1753 因为粗心错了好多次……,尤其是把1<<15当成了65535: 参考博客:http://www.cnblogs.com/k ...
随机推荐
- windows2003服务器,时间每隔1小时自动同步一次
有台服务器的时间总是不对,可能是电池快没电了吧,于是想让它时间保持更新状态,但又不想用第三方软件,在百度上查了一下,还真有方法 HKEY_LOCAL_MACHINE->SYSTEM->Cu ...
- JVM 类加载器 (二)
1.类加载器(ClassLoader)负责加载class文件,class文件在文件开头有特定的文件标识,并且ClassLoader只负责 class 文件的加载,至于class文件是否能够运行则由Ex ...
- java1.8 版本改成 java1.7版本
以前先安装的java1.7 大部分程序应该都是只支持1.7 不支持1.8 但是因为要跑一个别人的项目 要求是java1.8 所以想在电脑上同时装1.7和1.8 到官网上下载1.8 安装 安装完成后 并 ...
- FPKM与RPKM
FPKM与RPKM (2015-01-09 23:55:17) 转载▼ 标签: 转载 原文地址:FPKM与RPKM作者:Fiona_72965 定义: FPKM:Fragment Per Kil ...
- 洛谷1312 Mayan游戏
原题链接 讨厌这种大搜索题 基本就是模拟搜索,注意细节即可. 以下是我用的两个剪枝: 将块向左移的前提是左边为空,因为该题要求先右后左,所以若左边有块,那么在上一次搜索向右移的时候一定会搜过,且字典序 ...
- java 环境搭建
一.安装jdk 下载jdk http://www.oracle.com/technetwork/java/javase/downloads 将下载的jdk文件放到 /opt 下解压 $sudo cp ...
- 请简要介绍Sping MVC、IoC和AOP
Sping MVC是在Spring框架上发展起来的框架,它提供了构建Web应用程序的全功能MVC模块,使用了Spring可插入的MVC架构,可以自由的选择各个模块所使用的架构,非常灵活.Spring ...
- AJAX-URL-HTTP协议-缓存-DOM操作-HTML元素事件
1.URL 1.URL的作用 用于来表示任意一个资源的位置(互联网上). 协议+主机名+文件目录结构+文件名称 2.详解 格式: <scheme>://<user>:<p ...
- windows下如何修改mysql的端口号
- 2018.11.01 NOIP训练 树的排列(树形dp)
传送门 跟这道题差不多. 只不过是让权值小的儿子做权值大的儿子的父亲而已. 代码