博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1753 Flip Game
阅读量:5959 次
发布时间:2019-06-19

本文共 1875 字,大约阅读时间需要 6 分钟。

POJ_1753

    时隔多日,已经是第3次写这个题目了,在熟悉了位运算之后使得更有效率地解决了这个问题。

    同时,这个题目在枚举上也有一点小的技巧。如果要是暴力枚举的话,一旦棋盘到了16*16的话显然就吃不消了(一个东欧区域赛的题目),实际上我们完全可以只枚举第一行的操作,之后,如果我们想把棋子全部翻成一种颜色的话,那么第二行的操作就是固定的了(因为第一行的棋子的状态对第二行棋子的翻转进行了约束,如果想把第一行的棋子变成白色,那么第二行中位于第一行黑色棋子下方的位置必须翻转,反之亦然),那么第三行、第四行的操作显然也是固定的了。

    这样即使是16*16的棋盘也只有15*16*2^16的复杂度,是可以接受的。

#include
#include
int fresh, steps, dx[] = {
0, -1, 1, 0, 0}, dy[] = {
0, 0, 0, -1, 1}; void init() {
char ch; fresh = 0; for(int i = 0; i < 4; i ++) {
for(int j = 0; j < 4; j ++) fresh = (fresh << 1) + ((ch = getchar()) == 'b' ? 1 : 0); getchar(); } } void flip(int x, int y, int &st) {
if(x >= 0 && x < 4 && y >= 0 && y < 4) st ^= 1 << (x * 4 + y); } void dfs(int cur, int num, int st, int flag) {
if(cur == 4) {
if(st == 0xffff || st == 0) steps = num < steps ? num : steps; return; } int x, y; for(int i = cur - 1, j = 0; j < 4; ++ j) if(((st & (1 << (i * 4 + j))) >> (i * 4 + j)) ^ flag ) {
for(int k = 0; k < 5; ++ k) {
x = cur + dx[k]; y = j + dy[k]; flip(x, y, st); } ++ num; } dfs(cur + 1, num, st, flag); } int solve() {
steps = 0x7fffffff; for(int i = 0; i < 16; ++ i) {
int num = 0, st = fresh, x, y; for(int j = 0; j < 4; ++ j) {
if(i & (1 << j)) {
for(int k = 0; k < 5; k ++) {
x = 0 + dx[k]; y = j + dy[k]; flip(x, y, st); } num ++; } } dfs(1, num, st, 0); dfs(1, num, st, 1); } return steps == 0x7fffffff ? -1 : steps; } int main() {
init(); if(solve() != -1) printf("%d\n", steps); else printf("Impossible\n"); return 0; }

转载地址:http://ypuax.baihongyu.com/

你可能感兴趣的文章
明略数据吴明辉:AI商业化的核心是让用户合理接受机器的错误
查看>>
自定义View实例(二)----一步一步教你实现QQ健康界面
查看>>
Frame-relay 综合实验-4
查看>>
这个算法告诉你点链接会泄露多少秘密,帮你判断该不该点
查看>>
Gradle2.0用户指南翻译——第五章. 疑难解答
查看>>
make[1]: *** [/usr/local/pcre//Makefile] Error 127
查看>>
zabbix 自定义LLD
查看>>
Liferay 前端性能调优(3) Gzip Filter
查看>>
prototype中的$R函数的用法
查看>>
1-3 SQL与建立关系型数据表
查看>>
Linux上vi(vim)编辑器使用教程
查看>>
数据库内核月报 - 2017年12月
查看>>
killws 利用xfire部署webservice (xfire1.6+spring1.6+maven 进化版)
查看>>
【ZooKeeper Notes 27】ZooKeeper管理员指南——部署与管理ZooKeeper
查看>>
关于Exchange Server 2010中无法装入指定的数据的解决方法
查看>>
数据链路层的主要功能与服务
查看>>
Exchange server 2016 无人值守安装
查看>>
使用组策略配置Windows 7的高级防火墙
查看>>
ZoneMinder配置与使用
查看>>
Enterprise Library 3.0 体验(3):使用配置文件的Validation Application Block
查看>>