DFS.枚舉::poj1753 flip game && poj2965 the Pilots Brothers'refrigerator

Game Theory: 公平博弈 Notes: The following excerpt is from a book 《GAME THEORY》by Thomas && S.Ferguson and a paper by Ulyssess. 一. 公平聯合博弈 公平聯合博弈(Impartial combi 阅读详情

 枚舉,對於狀態或者搜索空間很少的情況可以用,是一種笨重的聰明方法!!

但有時候可以更深入地挖掘題目,得到更好的算法,例如poj2965

1.poj1753 flip game

題目:一个4*4的棋盤放滿棋子,每個棋子不是白色就是黑色。每次选择任意一个棋子翻轉变成相反的颜色,同時也要翻轉它相鄰的上,下,左,右棋子(如果存在的话)。问要把棋盤变成同一个颜色,最少需执行几次上面的操作。

分析:每一個格子至多翻轉1次。由於是4*4=16,只有2.^16=4096個狀態,最多也就16次操作。枚舉即可,“最少”的要求就用DFS來實現。所以本體既是枚舉也是DFS。

#include "stdafx.h"
#include<iostream>                //240K 360MS 
using namespace std;

bool map[6][6], find = false;
int step;   //步數
int dr[5] = {-1, 0, 0, 0, 1}; //行的上、左、中、右、下
int dc[5] = {0, -1, 0, 1, 0};

bool isgoal(){                           //  判断矩阵是否为同一个颜色。
    for(int i = 1; i <= 4; i ++)
        for(int j = 1; j <= 4; j ++)
            if(map[i][j] != map[1][1])
                return false;
    return true;
}
void flip(int row, int col){             //  翻动点(row,col)时的map[][]的变化。
    for(int i = 0; i < 5; i ++){
        int r = row + dr[i], c = col + dc[i];
        map[r][c] = !map[r][c];
    }
}
void dfs(int row, int col, int dep){     //  点(row,col)为现在是否要操作的点。
    if(dep == step){
        find = isgoal();
        return;
    }
    if(find || row == 5) return;
    flip(row, col);                      //  对点(row,col)进行翻动。
    if(col < 4) dfs(row, col + 1, dep + 1); //翻,順序搜索
    else dfs(row + 1, 1, dep + 1); 
    flip(row, col);                      // 還原,等價于不对点(row,col)进行翻动。
    if(col < 4) dfs(row, col + 1, dep);  //不翻,順序搜索
    else dfs(row + 1, 1, dep);
}
int _tmain(int argc, _TCHAR* argv[])
{
    char c;
    for(int i = 1; i <= 4; i++)
        for(int j = 1; j <= 4; j++){
            cin >> c;
            if(c == 'b') map[i][j] = true;
       }
    for(step = 0; step <= 16; step ++){   //  枚举 16 步。
        dfs(1, 1, 0);
        if(find) break;
    }
    if(find) cout << step << endl;
    else cout << "Impossible" << endl;
    return 0; 
}


2. poj2965 the Pilots Brothers'refrigerator

題目:冷藏庫有16個handle,每個handle只有“open”和“closed”這兩種狀態,當且僅當16個handle都open時冷藏庫的門才開得了。這十六個handle以4*4的矩陣給出,“-”表open,而“+”表closed,且每個局面至少有一個closed的handle。每次對一個位置的handle改變狀態的時候也會該表同行同列的handle的狀態。給定一個局面,求最小的改變次數使得門開,且輸出改變了哪些handle.

分析:和poj1753一樣,枚舉,不過這次需要記錄翻的位置,在哪裡記錄才是問題,肯定是在找到更小翻轉次數的時候進行記錄。

#include <iostream>          //240K 297MS 
using namespace std;
bool s[4][4],a[16],b[16];   //s記錄局面,a記錄狀態改變,b記錄需要翻的位置
int t=17;      //17是最大的翻轉次數的界
void dfs(int p,int c) //c是當前翻的次數
{
    int i,j,k=1,x,y;
    for(i=0;k&&i<4;i++)
        for(j=0;k&&j<4;j++)
            if(s[i][j]!=0)k=0;
    if(k){
        if(c<t){        //找到更小的翻轉次數
            t=c;
            for(i=0;i<16;i++)b[i]=a[i];    //記錄
        }
        return;
    }
    if(p>15)return;

    dfs(p+1,c);  	//不翻,繼續搜索

    x=p/4; y=p%4;
    for(i=0;i<4;i++){  //翻
        s[i][y]=!s[i][y]; s[x][i]=!s[x][i];
    }
    s[x][y]=!s[x][y];
a[p]=1;

    dfs(p+1,c+1);    //翻,然後繼續搜索

    for(i=0;i<4;i++){    //還原
        s[i][y]=!s[i][y]; s[x][i]=!s[x][i];
    }
    s[x][y]=!s[x][y];
    a[p]=0;
}
int _tmain(int argc, _TCHAR* argv[])
{
    char temp;
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
			cin>>temp;
            if(temp=='+')s[i][j]=1;
            else s[i][j]=0;
        }
    }
    memset(a,0,sizeof(a));
    dfs(0,0);
    cout<<t<<endl;
    for(int i=0;i<16;i++)
        if(b[i]) cout<<i/4+1<<' '<<i%4+1<<endl;
    return 0;
}

 

進一步分析:

和poj1753不同,本題沒有“impossible”的局面,是基於這樣的觀察:要是得一個位置的handle改變狀態而其他handle都不變,只需將該位置和同行同列的handle都翻轉一下!比如對handle[i][j]而言,如上操作之後,位置(i, j)被改變了7次,而同行同列的位置則被改變了4次,而其他的位置則被改變了2次。那么在輸入的時候,遇到“+”的時候就把該位置自加一,且同行同列的其他位置也自加一,等輸入完成后遍歷handle矩陣,奇數位置的就是要改變的!!這一點可以擺個棋盤從簡單的一個“+”入手研究得出。

#include "stdafx.h"
#include <iostream>          //240K 47MS 
using namespace std;
bool handle[4][4];

int _tmain(int argc, _TCHAR* argv[])
{
	char temp;
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			cin>>temp;
			if(temp=='+'){
				for(int row=0;row<4;row++){  //同列的自加一
					if(row==i) continue;
					else handle[row][j]=!handle[row][j];
				}
				for(int col=0;col<4;col++){  //同行的自加一
					if(col==j) continue;
					else handle[i][col]=!handle[i][col];
				}
				handle[i][j]=!handle[i][j];  //自己自加一
			}
		}
	}
	int sum=0;
	for(int i=0;i<4;i++){   //計算奇數狀態的個數
		for(int j=0;j<4;j++){
			if(handle[i][j])
				sum++;
		}
	}
	cout<<sum<<endl;
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			if(handle[i][j])
				cout<<i+1<<' '<<j+1<<endl;
		}
	}
	return 0;
}


 

Apple Pay不能添加卡,不一定是卡的问题,有可能是设备的问题 Apple Pay不能添加卡,不一定是卡的问题,有可能是设备的问题。 阅读详情

相关推荐

手把手教你用STM32CubeMX和HAL库驱动MT6835磁编码器(SPI读取21位角度)

本文详细介绍了如何使用STM32CubeMX和HAL库驱动MT6835磁编码器,通过SPI接口读取21位高精度角度数据。从硬件准备、CubeMX配置到HAL库驱动实现与优化,提供了完整的实战指南,帮助开发者快速掌握磁编码器的应用技巧,适用于机器人关节和精密仪器等高精度场景。

weixin_28716769的博客 439

poj 1753 Flip Game & poj2965

用位操作+BFS+枚举解决.基本思想如下: 给棋盘每一个状态赋予一个状态id,id计算方法是将棋盘与数的二进制表示联系起来,如题所给的数据: bwwb bbwb bwwb bwww 状态id为6585,计算方法为1*2^0+0*2^1+0*2^2..1*2^12+0*2^13..=6585(其中b代表1,w代表0) 在此基础上进行BFS搜索, 1)总的状

曲径通幽处 1313

告别信号毛刺!手把手教你用ADS和IBIS-AMI模型搞定PCIe Gen3眼图仿真

本文详细介绍了如何使用Keysight ADS和IBIS-AMI模型进行PCIe Gen3眼图仿真,解决高速信号传输中的信号质量问题。从仿真环境搭建、S参数预处理到眼图优化与故障排除,提供了一套完整的工程实践指南,帮助工程师提升PCIe Gen3接口的信号完整性。

weixin_28366053的博客 364

【枚举】POJ1753 Flip Game&POJ2965 The Pilots Brothers' refrigerator

Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28802   Accepted: 12460 Description Flip game is played on a rectangular 4x4 field with two-sided pie

F丶轩 780

Python+Tableau 全流程数据分析实战:从数据清洗到商业洞察可视化

本文通过Python+Tableau完整演示电商销售数据分析流程。首先使用Python进行数据清洗(缺失值处理、异常值过滤等)和探索性分析(商品类别、时间趋势等),然后导入Tableau创建交互式可视化仪表盘。分析发现电子产品销售额最高但利润率低,美妆类利润率最优,东部地区销售表现最好。最终提出优化供应链、加强美妆推广等商业建议,展示了Python数据处理与Tableau可视化的高效配合。所有代码可直接运行,适合数据分析初学者和从业者实战参考。

weixin_44520581的博客 337

宝马项目化流程标准(BMW ABC flyer requirement)

宝马项目化流程标准(BMW ABC flyer requirement)

于大博 7247

POJ 1753 Flip Game (DFS 太暴力了!)

Flip Game Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white and the other one is black and each p

bobo 8800

​​瑞芯微RK系列 vs 全志系列芯片:终极选型指南(2025版)​

​。

jinxi996611的博客 1万+

图算法

1. 图的基本概念 2. 图的存储结构 (1)邻接矩阵 一般来说,邻接矩阵所占空间与边数无关(不考虑压缩存储),适合于存储稠密图。为了反映一个图的全面信息,通常采用以下类型定义: #define MAXVEX 100 typedef char VertexType;

我以我心照人 1883

在mdk文件移植太多_XCubeClassB代码 的移植

前言ST在www.st.com官网上提供了针对IEC60730/IEC60335 ClassB认证的软件包。软件包分为三个,分别适用STM8,STM32(基于标准外设库)和STM32(基于HAL库):STM8-SafeCLASSB,STM32-CLASSB-SPL,X-CUBE-CLASSB。本文以X-CUBE-CLASSB为例介绍如何做代码的移植以及经常遇到的问题的解决办法。X-CUB...

weixin_28898707的博客 1832

【零基础入门unity游戏开发——unity通用篇30】Resources资源加载(基于unity6开发介绍)

Resources资源加载(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4114

貪心::poj1328 radar installation && poj2109 Power of Cryptography && poj2586 Y2K Accounting Bug

貪心,就是步步為贏。 這是ACM知識表里基礎算法中的貪心部分,屬於水題範疇。 1. poj1328 radar installation 題目:照抄了。 Assume the coasting is an infinite straight line. Land is

我以我心照人 1356

Esp32蓝牙Hid调用方案 http执行设备、鼠标、键盘相关操作

本文主要介绍 Esp32 蓝牙 Hid 相关的多种操作方式,详细的设备、鼠标、键盘相关操作的 http 调用方法。下面是整理出的所有 http 调用方法和 rhino 引擎方式。本机调用的话直接使用http://localhost:8080 如果是局域网调用则使用软件里的地址 比如我的是http://192.168.1.5:8080。文件地址: https://www.123865.com/s/Qtm4jv-xyZbd?使用前需要一块烧录好的ESP32板子并在手机安装好embedded软件用于蓝牙通信。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 569

时间代价分析

(1)主方法,对于具有递归式的方程很有用,其原理是递归树的计算。但此方法不是万能的。比如递归式T(n)=5T(n/5)+n/lgn,就得老老实实地用递归树去计算了。  (2)待续

我以我心照人 1259

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SCC

注:大部分参见百度百科。 在有向图G中,如果两个顶点vi,vj间有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,

我以我心照人 932

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SCC::poj2186 Popupar Cows && poj2553 The Bottom of A Graph

关于SCC的知识与算法,参见《SCC》一文。这两道题本质是一样的,细微的区别只在于输出而已。夜鱼只给我做前一道题,大概是看到我做的《图算法》的小结里面没有SCC的地位,想给我提个醒。后来我在那篇小结里面补上了SCC,顺便也对SCC的知识梳理了一遍,觉得手痒,网上查了一下还有poj

我以我心照人 909

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

單調隊列::poj2823 Sliding Window

题目: 一个长度为 N 的数组,一个长为 K 的滑动窗体从最左移至最右端, 你只能见到窗口的K个数,每次窗体向右移动一位,如下表: 要找出窗口在各位置时的 max value,min value Window position Min va

我以我心照人 738

DP/單調隊列::poj3250 Bad Hair Day

题目: Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ

我以我心照人 637

OS學習小結

《現代操作系統1~6》總結 Lyle 2011-8-25 一.       操作系統概論         一般計算機系統包含硬件、系統程序和應用程序三個部分。粗略地講,系統程序中最重要的操作系統,它夾在硬件和應用程序之間,其任務就是有效地管理計算機各種資源,使得使用計算機

我以我心照人 606

DP::poj1159 Palindrome

被1112卡了一个多星期,虽然思路很清晰了,各部分的独立跟踪测试也没什么问题,但,就是AC不了!无奈,只好先放着。     今天下午夜鱼又给我布置了一道题目,回文字符,挺有意思的,看完题目我就接着看村上的《当我跑步时 我谈些什么》,还美美地睡了半个小时。这些天实在缺午觉啊!醒来

我以我心照人 580

DP::Poj1050 To the max

题目:给定一个N*N方阵,元素为整数,求连续子阵全部元素和的最大值。   一开始我想直接在二维上解决问题,在构造递归方程的时候令max[k](k=i+j)为大小i*j的子阵的子阵和的最大值,然而下面的例子说明了没有最优子结构 0 -2 -7 0 9 2 -6 2 -4

我以我心照人 548

DP::Poj1015 July Compromise

初学DP,夜鱼就给我找了这么条难缠的“大鱼”,有点打击到我~~~~  问题:n個候選人,要挑m個組成陪審團。選人方法:控方和辯方根據喜歡程度為每個候選人打分(0~20),選出的這m個人,必須滿足辯方總分和控方總分的差的絕對值最小。如有多種方案,則選辯控雙方總分之和最大的方案即可

我以我心照人 454

DP::Poj1088 滑雪

这题不难,状态转移方程很快就写出来 m[i, j]=max{m[i-1, j](下)+1,m[i, j-1](左)+1,m[i+1, j](上)+1,m[i, j+1](右)+1}(若下左上右对应元素比s[i, j]小,则对应的m[ ]就可以出现在方程中) 具体实现的话也很简单

我以我心照人 432

DP.單調隊列::poj1631 Bridging signals

题目大意:两岸的同等数目的信号灯一一对应,连线,从中找出最多的线出来,它们之间互不交叉。只要求输出最大的线条数。   本题不需要画图了,因为画了图会尝试用二维的DP去做,吃力不讨好,既然输入是一维的一个串,而且该串简洁地包含了全部的信息,那么直接DP何乐而不为呢? 通过对例

我以我心照人 408

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 189

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 287
上一篇: OS學習小結
下一篇: 貪心::poj1328 radar installation && poj2109 Power of Cryptography && poj2586 Y2K Accounting Bug
初四
博客等级 码龄15年 3粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值