会做jsoi那道game,这题就非常简单了吧

我们考虑空格的移动,显然,初始与空格位置距离为奇数的黑棋和距离为偶数的白棋并没有什么用,

空格不会移到那,我们直接把他们当作障碍,其他点我们当作可移动区域

这不就和game那道题一样了吗,只不过这题不问棋子放哪

而是给定棋子位置,问当前是否是先手必胜

(错误操作就是指当前是先手必胜而移动一格还是先手必胜的操作)

我们对图重新黑白染色,做二分图匹配,显然,棋子在一定能被匹配的点上时,是先手必胜

证明类似game,因为棋子在一定在一定能被匹配的点上,我们第一步走向匹配点

下一步对方要么不能走,要么走一条非匹配边,那所到达的点,一定是匹配了的

否则,一开始的点就不一定在匹配,与假设矛盾,所以最后走的一条边一定是匹配边得证

至于怎么找一定能被匹配的点,我们做完二分图匹配后,如果这个点匹配了,那么我们删掉这个点,从这个点配对的点出发看是否能找到增广路即可

 const dx:array[..] of longint=(,,,-);
dy:array[..] of longint=(,-,,); type node=record
po,next:longint;
end; var e:array[..] of node;
v:array[..] of boolean;
b:array[..,..] of longint;
a:array[..,..] of char;
mat,p,c:array[..] of longint;
t,xx,yy,i,n,m,j,k,len,x,y,ans:longint;
f1,f2:boolean; procedure add(x,y:longint);
begin
inc(len);
e[len].po:=y;
e[len].next:=p[x];
p[x]:=len;
end; function dfs(x:longint):boolean;
var i,y:longint;
begin
v[x]:=true;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if not v[y] and (mat[y]<>-) then
begin
v[y]:=true;
if (mat[y]=) or dfs(mat[y]) then
begin
mat[y]:=x;
mat[x]:=y;
exit(true);
end;
end;
i:=e[i].next;
end;
exit(false);
end; function check:boolean;
var j,k:longint;
begin
k:=b[x,y];
j:=mat[k];
mat[j]:=;
mat[k]:=-;
if j= then exit(false)
else begin
fillchar(v,sizeof(v),false);
exit(not dfs(j));
end;
end; begin
readln(n,m);
for i:= to n do
begin
for j:= to m do
begin
read(a[i,j]);
if a[i,j]='.' then
begin
x:=i;
y:=j;
a[i,j]:='X';
end;
end;
readln;
end;
for i:= to n do
for j:= to m do
if (a[i,j]='O') xor ((abs(i-x)+abs(j-y)) mod =) then
begin
inc(t);
b[i,j]:=t;
end; for i:= to n do
for j:= to m do
if b[i,j]> then
begin
for k:= to do
begin
xx:=i+dx[k];
yy:=j+dy[k];
if b[xx,yy]> then add(b[i,j],b[xx,yy]);
end;
end; for i:= to t do
if mat[i]= then
begin
fillchar(v,sizeof(v),false);
dfs(i);
end; readln(k);
for i:= to k do
begin
f1:=check;
readln(x,y);
f2:=check;
if f1 and f2 then
begin
inc(ans);
c[ans]:=i;
end;
readln(x,y);
end;
writeln(ans);
for i:= to ans do
writeln(c[i]);
end.

bzoj2437的更多相关文章

  1. BZOJ2437 [Noi2011]兔兔与蛋蛋 【博弈论 + 二分图匹配】

    题目链接 BZOJ2437 题解 和JSOI2014很像 只不过这题动态删点 如果我们把空位置看做\(X\)的话,就会发现我们走的路径是一个\(OX\)交错的路径 然后将图二分染色,当前点必胜,当且仅 ...

  2. 【BZOJ2437】【NOI2011】兔兔与蛋蛋(博弈论,二分图匹配)

    [BZOJ2437][NOI2011]兔兔与蛋蛋(博弈论,二分图匹配) 题面 BZOJ 题解 考虑一下暴力吧. 对于每个状态,无非就是要考虑它是否是必胜状态 这个直接用\(dfs\)爆搜即可. 这样子 ...

  3. BZOJ2437 NOI2011兔兔与蛋蛋(二分图匹配+博弈)

    首先将棋盘黑白染色,不妨令空格处为黑色.那么移动奇数次后空格一定处于白色格子,偶数次后空格一定处于黑色格子.所以若有某个格子的棋子颜色与棋盘颜色不同,这个棋子就是没有用的.并且空格与某棋子交换后,棋子 ...

  4. bzoj2437 [Noi2011]兔兔与蛋蛋

    二分图博弈果然都是一个套路,必经点必胜,非必经点必败, 但是肯定不能每走一步就重新建图判断必胜还是必败,那么我们可以这样:每走一步就把这个点删掉,然后find他原来的匹配,如果找不到,就说明他是必经点 ...

  5. 【bzoj2437】[Noi2011]兔兔与蛋蛋 二分图最大匹配+博弈论

    Description Input 输入的第一行包含两个正整数 n.m. 接下来 n行描述初始棋盘.其中第i 行包含 m个字符,每个字符都是大写英文字母"X".大写英文字母&quo ...

  6. 【BZOJ2437】[Noi2011]兔兔与蛋蛋(博弈+二分图)

    传送门 题意: 给出一个\(n*m\)的棋盘,上面有若干个黑色棋子,若干个白色棋子,还有一个空格. 每次先手选择一个空格,将它与相邻的某个白色棋子交换:后手则选择一个空格,与相邻的某个黑色棋子交换. ...

随机推荐

  1. 不同的source control下配置DiffMerge

    TFS: 1. 打开Option -> Source Control -> Visual Studio TFS -> Configure User Tools; 2. 添加 .*, ...

  2. java 回传参数

    通过 new 创建的对象可以实现回传,如数组:自定义类对象里的参数. [数组方式] public static void main(String[] args) { try { int [] amou ...

  3. c++ 获取本地ip地址

    最终版本:采用指针传参数,不使用别名形式. #include <unistd.h> #include <netdb.h> //gethostbyname #include &l ...

  4. [转载]AFX_MANAGE_STATE关于资源切换

    应用程序进程本身及其调用的每个DLL模块都具有一个全局唯一的HINSTANCE句柄,它们代表了DLL或EXE模块在进程虚拟空间中的起始地址.进程本身的模块句柄一般为0x400000,而DLL模块的缺省 ...

  5. [51 nod]1009 数字1的数量

    1009 数字1的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数.   例如: ...

  6. First Lua function running in C

    这是我在C里面跑出来的第一个Lua 文件, 纪念一下. 1.Set up envirnonment: Mac下面 Lua的src (即include) 和lib(binary)是分开的, 所以需要分别 ...

  7. java基础知识回顾之javaIO类--File类

    File类是对文件系统中文件以及目录(文件夹)进行封装的对象,可以通过面向对象的思想来操作文件和目录(文件夹).File类保存文件或目录的各种元素的信息,包括文件名,文件长度,最后修改日期,是否可读, ...

  8. cojs QAQ的矩阵 题解报告

    题目描述非常的清晰 首先我们考虑(A*B)^m的求法,这个部分可以参考BZOJ 杰杰的女性朋友 我们不难发现(A*B)^m=A*(B*A)^(m-1)*B A*B是n*n的矩阵,而B*A是k*k的矩阵 ...

  9. React-用ImmutableJS提高性能

    一.需求 1.子组件有更新时,只重新渲染有变化的子组件,而不是全部 二.ImmutableJS原理 三.代码 1.CheckboxWithLabel.jsx var React = require(' ...

  10. C++:函数模板与模板函数

    6.1 模板的概念 C++允许用同一个函数定义函数,这些函数的参数个数和参数类型不同.例如求最大值的max函数, int max(int x,int y) {       return (x>y ...