Flip Game(状态压缩+深搜)优化时间复杂度
黑白棋翻转问题
题目描述
在一个4x4的棋盘上放有16枚一面黑一面白的棋子。
每次操作时,你可以选择一枚棋子,然后将这枚棋子以及它上下左右相邻的棋子(如果有的话)翻面(颜色反转)。
给定棋盘初始的样子,请问在一些操作后,是否可以将所有棋子都变成一个颜色?如果可以的话,最少需要多少步?
输入
输入包括4行,每行4个字母,用来描述棋盘初始的状态。字母只可能是b或者w,b代表白色朝上,w代表黑色朝上。
输出
包括一行,如果能让所有棋子变成一个颜色,输出所需要的最短步数;如果没有解,输出Impossible。
样例输入
bwwb
bbwb
bwwb
bwww
样例输出
4
题目大意
有一个n*m的格子,每个格子都有黑白两面(0表示白色,1表示黑色)。我们需要把所有的格子都反转成黑色,每反转一个格子,它上下左右的格子都会跟着反转。请求出用最小步数完成反转时每个格子反转的次数。若无解输出Impossible。
题目思想
将wb转换成01——方便change()
先按字典顺序枚举第一行的全部可能,再去推第2行,第3行……把这些行全部推成0(1),最后看最后一行,如果最后一行都是0(1),则成功,记录翻转次数。否则失败。优化时间复杂度2^n方 变成 2^n
第一次使用memcpy
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include <cstdlib>
#define mem(a,x) memset(a,x,sizeof(a))
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull; // %llu
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = -1u>>1;
const int maxn = 1e5+10;
char s[10

本文介绍了如何利用状态压缩和深度搜索优化解决4x4棋盘上的黑白棋翻转问题。通过将棋子颜色转换为01表示,逐行进行状态推导,直到所有棋子变为同一颜色或判断无解。样例给出了具体的操作步骤和输出结果。文章探讨了如何将时间复杂度从2^n平方降低到2^n。

2821

被折叠的 条评论
为什么被折叠?



