首页 > 其他分享 > NOI2011真题:兔兔与蛋蛋游戏

NOI2011真题:兔兔与蛋蛋游戏

时间:2022-11-21 14:44:07浏览次数:74  
标签:游戏 真题 int 兔兔 蛋蛋 棋子 NOI2011 操作

NOI2011真题:兔兔与蛋蛋游戏


题目描述

这些天,兔兔和蛋蛋喜欢上了一种新的棋类游戏。

这个游戏是在一个 n行 m 列的棋盘上进行的。游戏开始之前,棋盘上有一个格子是空的,其它的格子中都放置了一枚棋子,棋子或者是黑色,或者是白色。

每一局游戏总是兔兔先操作,之后双方轮流操作,具体操作为:

·兔兔每次操作时,选择一枚与空格相邻的白色棋子,将它移进空格。
·蛋蛋每次操作时,选择一枚与空格相邻的黑色棋子,将它移进空格。
第一个不能按照规则操作的人输掉游戏。为了描述方便,下面将操作“将第x行第y列中的棋子移进空格中”记为 M(x,y)M(x,y)。

例如下面是三个游戏的例子。
image
最近兔兔总是输掉游戏,而且蛋蛋格外嚣张,于是兔兔想请她的好朋友——你——来帮助她。她带来了一局输给蛋蛋的游戏的实录,请你指出这一局游戏中所有她“犯错误”的地方。

注意:

·两个格子相邻当且仅当它们有一条公共边。
·兔兔的操作是“犯错误”的,当且仅当,在这次操作前兔兔有必胜策略,而这次操作后蛋蛋有必胜策略。

输入格式

输入的第一行包含两个正整数 n,m。

接下来 n 行描述初始棋盘。其中第 i 行包含 m个字符,每个字符都是大写英文字母 X、大写英文字母 O 或点号 . 之一,分别表示对应的棋盘格中有黑色棋子、有白色棋子和没有棋子。其中点号 . 恰好出现一次。

接下来一行包含一个整数 k(1≤k≤1000) ,表示兔兔和蛋蛋各进行了 k 次操作。

接下来 2k 行描述一局游戏的过程。其中第 2i – 1 行是兔兔的第 i 次操作(编号为 i 的操作) ,第 2i 行是蛋蛋的第 i 次操作。每个操作使用两个整数 x,y 来描述,表示将第 x 行第 y列中的棋子移进空格中。

输入保证整个棋盘中只有一个格子没有棋子, 游戏过程中兔兔和蛋蛋的每个操作都是合法的,且最后蛋蛋获胜。

输出格式

输出文件的第一行包含一个整数 r,表示兔兔犯错误的总次数。

接下来 r行按递增的顺序给出兔兔“犯错误”的操作编号。其中第 i 行包含一个整数ai表示兔兔第 i 个犯错误的操作是他在游戏中的第 ai次操作。

输入样例:

1 6
XO.OXO
1
1 2
1 1

输出样例:

1
1

说明提示:

image

解法:

知识:二分图,博弈论,深度优先搜索

先审清楚题意。A 一步走错的判定:A 走这步之前,A先手采用最优策略必胜;A 走这步之后,B先手采用最优策略必胜。
判断的过程:强制当前点不选,如果它的匹配点仍然能找到新的匹配点,说明有一种最大匹配不包含它,自然它就不是 一定 在最大匹配中。

代码:

#include<bits/stdc++.h> 
using namespace std;
const int MAXN=41,MAXS=1601,MAXK=1001;
int n,m,dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int tar[MAXS];
bool vis[MAXS],win[MAXK];
bool bel[MAXN][MAXN],col[MAXN][MAXN],del[MAXS];
vector <int> edge[MAXS],src;
inline int id(int x,int y) {
	if(x<1||x>n||y<1||y>m||bel[x][y]!=col[x][y]) return -1;
	return (x-1)*m+y;
}
inline bool match(int p) {
	if(del[p]) return false;
	for(int x:edge[p]) {
		if(vis[x]||del[x]) continue;
		vis[x]=true;
		if(tar[x]==-1||match(tar[x])) {
			tar[x]=p;
			return true;
		}
	}
	return false;
}
inline int MM() {
	int ret=0;
	memset(tar,-1,sizeof(tar));
	for(int x:src) {
		memset(vis,false,sizeof(vis));
		if(match(x)) ++ret;
	}
	return ret;
}
signed main() {
	int kx,ky;
	cin>>n>>m;
	for(int i=1;i<=n;++i) {
		for(int j=1;j<=m;++j) {
			char ch;
			cin>>ch;
			if(ch=='.') kx=i,ky=j,bel[i][j]=true;
			else bel[i][j]=(ch=='X');
		}
	}
	for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) col[i][j]=((i+j)%2==(kx+ky)%2);
	for(int i=1;i<=n;++i) {
		for(int j=1;j<=m;++j) {
			if(bel[i][j]&&col[i][j]) {
				src.push_back(id(i,j));
				for(int k:{0,1,2,3}) {
					int x=i+dx[k],y=j+dy[k];
					if(id(x,y)!=-1) {
						edge[id(i,j)].push_back(id(x,y));
					}
				}
			}
		}
	}
	int stdv=MM(),k;
	del[id(kx,ky)]=true;
	int tmpv=MM();
	win[1]=tmpv!=stdv;
	stdv=tmpv;
	scanf("%d",&k);
	vector <int> ans;
	for(int i=1;i<=k;++i) {
		int tx,ty;
		scanf("%d%d",&tx,&ty);
		del[id(tx,ty)]=true;
		tmpv=MM();
		win[i*2]=tmpv!=stdv;
		stdv=tmpv;
		if(win[i*2]&&win[i*2-1]) ans.push_back(i);
		scanf("%d%d",&tx,&ty);
		del[id(tx,ty)]=true;
		tmpv=MM();
		win[i*2+1]=tmpv!=stdv;
		stdv=tmpv;
	}
	printf("%d\n",(int)ans.size());
	for(int p:ans) printf("%d\n",p);
	return 0;
}

标签:游戏,真题,int,兔兔,蛋蛋,棋子,NOI2011,操作
From: https://www.cnblogs.com/demc/p/16911350.html

相关文章

  • 2022年下半年软考网络规划设计师论文真题2022年下半年软考网络规划设计师论文真题
    2022年下半年软考网络规划设计师论文真题试题一论5G与校园网络融合的规划与设计近年来,教育部等部门印发了《教育信息化2.0行动计划》:《关于推进教育新型基础设施建设......
  • 2022csp普及组真题:解密(decode)
    2022csp普及组真题:解密(decode)题目【题目描述】给定一个正整数 k,有 k 次询问,每次给定三个正整数 ni,ei,di,求两个正整数 pi,qi, 使 ni=pi×qi, ei×......
  • React-Hooks怎样封装防抖和节流-面试真题
    Debouncedebounce原意消除抖动,对于事件触发频繁的场景,只有最后由程序控制的事件是有效的。防抖函数,我们需要做的是在一件事触发的时候设置一个定时器使事件延迟发生,在......
  • Word19 撰写企业质量管理论文office真题
    1.看到题目要求:打开考试文件下的素材文档“WPS.docx”文件,后续操作均基于此文件,否则不得分。 2.这一步的操作非常简单,打开文件目录进行双击打开即可完成操作。3.看到......
  • Word16 供应链的管理论文office真题
    1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分。  2.这一步非常的简单,打开下载素材......
  • Word15 财务部年度报告office真题
    1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分。   2.这一步非常的简单,打开下载素......
  • Word14 互联网络发展状况统计报告office真题
    1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分。  2.这一步非常的简单,打开下载素材......
  • Word13 《经费联审结算单》模板office真题
    1.根据题目一的要求,打开素材文件,点击【文件】-【另存为】,选择【当前文件夹】,命名为Word。   2.根据题目二的要求,在【布局】里点击【页面设置】的右下角,打开页面设......
  • 测试面试 | 一道大厂算法面试真题,你能答上来吗?(附答案)
    时光飞快,眨眼又到一年年底!年底其实是跳槽换坑的绝佳时机,毕竟可以「年前面试,年后入职」,而且面试越早,好坑位较多,可选择的余地也较大。建议有换工作意向的测试同学可以多发发简......
  • P5309 [Ynoi2011] 初始化
    P5309[Ynoi2011]初始化考虑暴力,模拟题意,时间复杂度竟是\(O(\frac{n^2}{x})\),那么对于\(x\ge\sqrt{n}\)的修改就可以暴力了,这不是根号分治吗。再去考虑\(x<\sqrt{n}......