昨天晚上12点刷到的这个题,一开始一位是BFS,但是一直没有思路。后来推了一下发现只需要依次枚举第一行的所有翻转状态然后再对每个情况的其它田地翻转进行暴力dfs就可以,但是由于二进制压缩学的不是很透,一直有小问题,下面我还会讲子集生成的相关方法,有兴趣的同学可以继续关注。

  本题大意:一块地,有黑(1)白(0)之分,牛每次踩踏使得当前块以及四连块都变色,问当牛如何踩时使得地都变白并且求出最小踩踏次数和踩踏路径的最小字典序时的踩踏地图。

  本题思路:由于同一块地被翻两次都会回到原来的状态,所以只需要对应每块地看他上方的地是否为黑色,为黑色则翻否则看其他情况,由于第一排的黑色只有第二排能翻,所以需要先对第一排进行枚举,然后再对其剩余的状态进行搜索即可。那么如何判断某块地是否为黑色呢,这里我们采用二进制压缩,大意就是从1 -(1 << n) 的所有数字即逆序枚举了所有状态,然后访问每个状态,如果此地上方的为白色地则跳过,黑色地则进行翻转。具体如下图所示。

  首先我们假设有m == 4列,则它所对应的数字如下图所示。

每个数对应的二进制码位如果为1则翻转,否则不翻转。

  参考代码:

 #include <cstdio>
#include <cstring>
using namespace std; const int maxn = + , INF = 0x3f3f3f;
int n, m, minx = INF;
int maze[maxn][maxn], temp[maxn][maxn], vis[maxn][maxn], ans[maxn][maxn];
int dx[] = {, , -, }, dy[] = {, , , -}; void reverse(int u, int v) {
vis[u][v] = ;
temp[u][v] = !temp[u][v];
for(int p = ; p < ; p ++) {
int ni = u + dx[p], nj = v + dy[p];
if(ni >= && nj >= && ni < n && nj < m)
temp[ni][nj] = !temp[ni][nj];
}
} bool Judge() {
for(int i = ; i < n; i ++)
for(int j = ; j < m; j ++)
if(temp[i][j] == ) return false;
return true;
} void solve(int x) {
memcpy(temp, maze, sizeof(maze));
memset(vis, , sizeof(vis));
int cnt = ;
for(int i = ; i < m; i ++) {
if((x >> i) & ) {
cnt ++;
reverse(, i);
}
}
for(int i = ; i < n; i ++) {
for(int j = ; j < m; j ++) {
if(temp[i - ][j] == ) {
reverse(i, j);
cnt ++;
}
}
}
if(Judge() && cnt < minx) {
minx = cnt;
memcpy(ans, vis, sizeof(vis));
}
} int main () {
scanf("%d %d", &n, &m);
for(int i = ; i < n; i ++)
for(int j = ; j < m; j++)
scanf("%d", &maze[i][j]);
for(int i = ; i < ( << m); i ++)
solve(i);
if(minx == INF)
printf("IMPOSSIBLE\n");
else {
for(int i = ; i < n; i ++) {
for(int j = ; j < m - ; j ++) {
printf("%d ", ans[i][j]);
}
printf("%d\n", ans[i][m - ]);
}
}
return ;
}

View Cod

最新文章

  1. 用实例讲解RSA加密算法(精)
  2. sql in(1,2,3)参数化查询,错误在将 varchar 值 &#39;1,2,3,4&#39; 转换成数据类型 int 时失败
  3. java对象比较器和克隆
  4. Zeller公式推导及C#代码示例(待完善)
  5. [示例]NSDictionary编程题-字典的排序应用(iOS6班)
  6. 如何判断raid1中哪块硬盘损坏?
  7. 精读《javascript高级程序设计》笔记二——变量、作用域、内存以及引用类型
  8. Struts2 设置--Myelipse
  9. 数据库ER图 PowerDesigner
  10. Window7系统下安装jdk
  11. 基于SDL2实现俄罗斯方块
  12. PHY过采样问题
  13. docker--Dockerfile--sonarqube
  14. 启动项目时出现java.io.EOFException异常。
  15. 巧用JLINK来实现nrf51822的蓝牙设备流水号
  16. 和我一起学python
  17. 使用poi进行excel导入并解析插入数据库
  18. CentOS下安装man手册
  19. 160801、BlockingQueue处理多线程
  20. Appium Android 元素定位方法 原生+H5

热门文章

  1. 错误:SyntaxError: Missing parentheses in call to &#39;print&#39;
  2. Spring Cloud (5)hystrix 服务降级
  3. js 正则函数初级
  4. CTags配好后仍找不到函数定义的问题
  5. 卸载数据盘、更改Inodes
  6. UE 不生成.bak文件
  7. 灵活控制 Hibernate 的日志或 SQL 输出,以便于诊断
  8. 1.13.Mark1
  9. mac shortcut
  10. 吴裕雄 25-MySQL 临时表