Poj1753 翻转棋子
这个题就是用枚举举遍所有情况,然后一个一个深搜看看是不是符合条件,符合条件直接退出,不符合则继续,
由于表格只有16个所以可以得知最多的步数只能是16,所以可以根据步数从0到16依次枚举,
第一个符合条件的就是最小的步数,为了容易深搜,可以设定顺序为一行一行深搜,当一行搜完时从下一行开头搜,
代码和测试数据如下:
#include<stdio.h>
int flag;
int step;
int map[][]; void turn(int i, int j) //转换
{
map[i][j] = !(map[i][j]);
if (i > )
{
map[i-][j] = !(map[i-][j]);
}
if (i < )
{
map[i + ][j] = !(map[i + ][j]);
}
if (j > )
{
map[i][j-] = !(map[i][j-]);
}
if (j < )
{
map[i][j + ] = !(map[i][j + ]);
}
} int range()//判定表格是否全部一样
{
int i, j;
for (i = ; i < ; i++)
{
for (j = ; j < ; j++)
{
if (map[i][j] != map[][])
{
return ;
}
}
}
return ;
} int DFS(int i, int j, int dp)//深搜(dp<=step)
{
//对第dp次的转换作判断
if (dp == step)
{
flag = range();
return ;
}
if (flag || i == )
{
return ;
} //没有以上两种可以直接退出函数的情况,
//说明此时的dp<step,就进行第dp+1次的转换
turn(i, j); //对第dp+1次的转换进行判断
if (j < )
{
//判断的是第dp+1次时转换的turn(i,j),
//如果判断成功,直接退出函数。
//如果判断失败,要继续进行下一列(即j+1)的递归转换和判断
//j+1不影响对第dp+1次转换的turn(i,j)的判断
//因为在DFS()函数里,判断turn(i,j)的步骤总在turn(i,j+1)前面
DFS(i, j+, dp + );
}
else
{
//判断的是第dp+1次时转换的turn(i,j),
//如果判断成功,直接退出函数。
//如果判断失败,要继续进行下一行(即i+1)的递归转换和判断
//i+1不影响对第dp+1次转换的turn(i,j)的判断
//因为在DFS()函数里,判断turn(i,j)的步骤总在turn(i+1,j)前面
DFS(i + , , dp+);
} turn(i, j); //不符合条件,重新转换回来 //第dp次时,表格恢复初始状态
if (j < )
{
DFS(i, j + , dp ); //进行对下一列进行第dp次的转换()
}
else
{
DFS(i + , , dp); //进行对下一行进行第dp次的转换
} return ; } int main()
{
char a;
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
scanf("%c", &a);
if (a == 'b')
{
map[i][j] = ;
}
else
{
map[i][j] = ;
}
}
getchar(); //不要遗忘
} for (step = ; step <= ; step++)
{
flag = ;
DFS(, , );
if (flag)
break;
}
if (flag)
{
printf("%d\n", step);
}
else
{
printf("Impossible\n");
} return ; }
Poj1753 翻转棋子的更多相关文章
- POJ1753——Flip Game
Flip Game Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on ...
- POJ 1753 Flip Game (状态压缩 bfs+位运算)
Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...
- Flip Game(枚举)Poj
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31329 Accepted: 13622 De ...
- POJ 1753 Flip Game(状态压缩+BFS)
题目网址:http://poj.org/problem?id=1753 题目: Flip Game Description Flip game is played on a rectangular 4 ...
- 1753 -- Flip Game
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 48663 Accepted: 20724 Descr ...
- POJ 1753 Flip Game (状压+暴力)
题目链接:http://poj.org/problem?id=1753 题意: 给你一个4*4的棋盘,上面有两种颜色的棋子(一种黑色,一种白色),你一次可以选择一个棋子翻转它(黑色变成白色,同理反之) ...
- python3+tkinter实现的黑白棋,代码完整 100%能运行
今天分享给大家的是采用Python3+tkinter制作而成的小项目--黑白棋 tkinter是Python内置的图形化模块,简单易用,一般的小型UI程序可以快速用它实现,具体的tkinter相关知识 ...
- 在4x4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),右下角坐标为(4,4),现在依次有一些翻转操作,要对一些给定支点坐标为中心的上下左右四个棋子的颜色进行翻转,请计算出翻转后的棋盘颜色。
// ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...
- NC235250 牛可乐的翻转游戏
NC235250 牛可乐的翻转游戏 题目 题目描述 牛可乐发明了一种新型的翻转游戏! 在一个有 \(n\) 行 \(m\) 列的棋盘上,每个格子摆放有一枚棋子,每一枚棋子的颜色要么是黑色,要么是白色. ...
随机推荐
- 【Linux常见命令】split命令
split - split a file into pieces 按照指定的行数或大小分割文件 语法: split [OPTION]... [INPUT [PREFIX]] Output fixed- ...
- BigDecimal 01 - 在JAVA中怎么比较Double类型数据的大小?
2019独角兽企业重金招聘Python工程师标准>>> 非整型数,运算由于精度问题,可能会有误差,建议使用BigDecimal类型! double a = 0.001; doub ...
- 外媒评Mate 10 Pro:智慧拍照惊人,续航能力卓越
说到近期的热门机型,华为Mate 10 Pro绝对算是被人们谈论最多的一个,其可以算是首款搭载移动AI芯片的顶级旗舰机型,而且AI技术在这部手机上拥有多项实际的应用,带来的体验非传统智能手机可比. 由 ...
- double运算的坑
某个结果运算后,得出的数据:a = 15.599999999 而不是15.6,导致条件判断 a < 15.6 为true,使程序出现bug 解决办法,对运算后的浮点数,进行格式化(以保留一位小数 ...
- Spring依赖注入—@Resource注解使用
1.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowire ...
- web安全笔记
判断网站是否伪静态 把.html后缀即可或者加.php?id=99 例子:33_99.html 去掉.html和_变成33.php?id=99 即可判断是否伪静态 判断网站是否在win或者linu ...
- python操作ansible api示例
#!/usr/bin/env python # -*- coding:utf-8 -*- import json import shutil from collections import named ...
- I - Union 2019ccpc女生赛
I - Union 这是2019女生赛最难的一个题目,但是现在去写,我觉得没有想象之中的那么难. 把这个题目分成几个部分来考虑. 假设给你k个数,让你分成三个集合,满足这四个条件,且不需要考虑时间和空 ...
- 基于KepServer实现与S7-1200PLC之间的通信
对于学习上位机开发,有一种通信方式是必须要了解的,那就是OPC是OLE for Process Control的简称,然而随着技术的不断发展,人们开始对它有了新的定义,比如Open Platform ...
- Linux 内核工作队列之work_struct 学习总结
前言 编写Linux驱动的时候对于work_struct的使用还是很普遍的,很早之前就在阅读驱动源码的时候就看到了它的踪影,根据其命名大概知道了它的具体作用,但是仍然不知所以,同时,伴随出现的还有de ...