POJ 1753 Flip Game(回溯)
文章目录
- 1. 题目
- 1.1 题目链接
- 1.2 题目大意
- 1.3 解题思路
- 2. 代码
- 2.1 Wrong Answer代码
- 2.2 Accepted代码
1. 题目
1.1 题目链接
http://poj.org/problem?id=1753
1.2 题目大意
一个黑白棋子的棋盘,一个反过来周围四个也跟着反过来(如果存在的话),颜色取反,问最少反转次数使得颜色全白或者全黑,不存在解的话输出信息。
1.3 解题思路
采用回溯算法,暴力枚举
2. 代码
2.1 Wrong Answer代码
/*** @description: * @author: michael ming* @date: 2019/7/11 22:09* @modified by: */
#include <iostream>
#include <string>
using namespace std;
bool a[4][4];
bool isok()//判断是否都是同种颜色
{int i, j;for(i = 0; i < 4; ++i){for(j = 0; j < 4; ++j){if(a[i][j] != a[0][0]){return false;}}}return true;
}
void flipAndUpdate(int r, int c)//翻转r,c处及其周围棋子
{a[r][c] = !a[r][c];if(r-1 >= 0)a[r-1][c] = !a[r-1][c];if(r+1 < 4)a[r+1][c] = !a[r+1][c];if(c-1 >= 0)a[r][c-1] = !a[r][c-1];if(c+1 < 4)a[r][c+1] = !a[r][c+1];
}
void flip(int r, int c,int curstep, long &minstep)
{if(isok()){if(curstep < minstep)minstep = curstep;return;}if(c+1 < 4)flip(r,c+1,curstep,minstep);else if(c+1 == 4 && r+1 < 4)flip(r+1,0,curstep,minstep);flipAndUpdate(r,c);curstep++;if(c+1 < 4)flip(r,c+1,curstep,minstep);else if(c+1 == 4 && r+1 < 4)flip(r+1,0,curstep,minstep);flipAndUpdate(r,c);//翻完了,还要复原?
}
int main()
{string s;int i, j;long minstep = 65536;for(i = 0; i < 4; ++i){cin >> s;for(j = 0; j < 4; ++j){if(s[j] == 'b')a[i][j] = 1;elsea[i][j] = 0;}}flip(0,0,0,minstep);if(minstep == 65536)cout << "Impossible" << endl;elsecout << minstep;return 0;
}
2.2 Accepted代码
上面代码范围有问题,改动如下
AC 代码如下
/*** @description: * @author: michael ming* @date: 2019/7/11 22:09* @modified by: */
#include <iostream>
#include <string>
using namespace std;
bool a[5][5];
bool isok()//判断是否都是同种颜色
{int i, j;for(i = 0; i < 4; ++i){for(j = 0; j < 4; ++j){if(a[i][j] != a[0][0]){return false;}}}return true;
}
void flipAndUpdate(int r, int c)//翻转r,c处及其周围棋子
{a[r][c] = !a[r][c];if(r-1 >= 0)a[r-1][c] = !a[r-1][c];if(r+1 < 4)a[r+1][c] = !a[r+1][c];if(c-1 >= 0)a[r][c-1] = !a[r][c-1];if(c+1 < 4)a[r][c+1] = !a[r][c+1];
}void flip(int r, int c,int curstep, long &minstep)
{if(isok()){if(curstep < minstep)minstep = curstep;return;}if(r == 4)return;if(c+1 < 4)flip(r,c+1,curstep,minstep);else if(c+1 == 4)flip(r+1,0,curstep,minstep);flipAndUpdate(r,c);curstep++;if(c+1 < 4)flip(r,c+1,curstep,minstep);else if(c+1 == 4)flip(r+1,0,curstep,minstep);flipAndUpdate(r,c);//翻完了,还要复原?
}
int main()
{string s;int i, j;long minstep = 65536;for(i = 0; i < 4; ++i){cin >> s;for(j = 0; j < 4; ++j){if(s[j] == 'b')a[i][j] = 1;elsea[i][j] = 0;}}flip(0,0,0,minstep);if(minstep == 65536)cout << "Impossible" << endl;elsecout << minstep;return 0;
}
POJ 1753 Flip Game(回溯)相关推荐
- J - 最强王者 POJ - 1753 Flip Game 搜索+状态压缩
J - 最强王者 POJ - 1753 Flip game is played on a rectangular 4x4 field with two-sided pieces placed on e ...
- POJ 1753 Flip Game DFS枚举
看题传送门:http://poj.org/problem?id=1753 DFS枚举的应用. 基本上是参考大神的.... 学习学习.. #include<cstdio> #include& ...
- poj 1753 Flip Game 高斯消元 异或方程组 求最值
题目链接:http://poj.org/problem?id=1753 题意:给出一张4*4的图,表示16个方格的初始颜色的情况(白或黑),相邻方格操作的时候会相互影响,求最少的操作次数,使得每个方格 ...
- POJ 1753 Flip Game 高斯消元
和1222,1681差不多 POJ 1222 高斯消元更稳 POJ 1681 高斯消元 枚举自由变元 equ = 16 ,var = 16的方程组 #include <cstdio> #i ...
- POJ 1753 Flip Game(递归枚举)
题目:1753 题意:有一个4*4的棋盘,棋盘上有黑白格,每一次你可以翻其中的一个格子.一个格子(x,y)如果被翻,它相邻的前后左右四个格子(如果在棋盘上)也要翻转.现在给你一个初始的棋盘状态,问把这 ...
- poj 1753 Flip Game dfs 技巧
dfs 有翻和不翻两种选择,妙 #include <iostream>using namespace std; int map[4][4]; int next[4][2]= {{0,1}, ...
- POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)
题目大意:有一个4*4的方格,每个方格中放一粒棋子,这个棋子一面是白色,一面是黑色.游戏规则为每次任选16颗中的一颗,把选中的这颗以及它四周的棋子一并反过来,当所有的棋子都是同一个颜色朝上时,游戏就完 ...
- POJ 1753 Flip Game 简单BFS
很简单的搜索题目,随便写. 也能枚举,因为每个点翻转2次和不翻转没区别,所以可以枚举每个点翻转或者不翻转 题目链接 1 #include <stdio.h> 2 #include < ...
- poj 3279 poj 1753
poj 3279: Description Farmer John knows that an intellectually satisfied cow is a happy cow who will ...
最新文章
- 常见字符串和数值间得转换
- (转)Ubuntu12.04上NFS Server安装使用过程
- java实现123n_用Java编程 :输入一个正整数n,输出n!的值。 其中n!=1*2*3*…*n。 求高手指点...
- 【Oracle认证必读】常见问题解答
- python 发送邮件附件很慢_python下smtpsendmail发送特别慢
- 电源模块的6个优势及其作用
- 转自: http://blog.csdn.net/xiaxiaorui2003/article/details/3838631
- python接口编程_Python 中的面向接口编程
- MongoDB查询时排序字段为int类型和string类型的区别
- 2021人工智能竞赛白皮书:1000场竞赛的深度分析
- Ubuntu 16.04 LTS误删系统内核或驱动导致无法上网解决方案
- Win10更新失败的解决办法
- mikrotik桥接TP-link教程
- Ubuntu Cleaner清理工具
- 如何构建一个大脑---为工程师们介绍神经生理学.
- 如何获取三维标签的轮廓表示
- Java 必会10大的经典算法
- HTML标签检查工具
- 重新定义车载语音交互:服务“全家人”的“自由对话”
- 计算机视觉基础之数字图像(2)