P4055 [JSOI2009] 游戏

题目传送门

题目大意 :

小AA和小YY玩游戏,在这个游戏中,同一个格子不能进入两次,且不能将棋子移动到某些格子中去。当玩家无法继续移动棋子时,游戏结束,最后一个移动棋子的玩家赢得了游戏。由小AA决定棋子的初始位置 , 求小AA能够赢得游戏的棋子的初始位置。

思路:

将棋盘黑白染色,能够到达的两个点之间连一条双向边,求原图的最大匹配。

每种最大匹配方案中的未匹配点都是能够赢得游戏的点。

先手只要先走未匹配点,不管如何后手走完之后,先手都可以找到一个位置走。

如果原图能够完美匹配,那么先手无论走哪里,后手都可以走它的匹配点,所以先手必输。

不用分x部和y部

听说数据没有Lose?

code

#include <bits/stdc++.h>
#define fu(x, y, z) for (int x = y; x <= z; x++)
using namespace std;
const int N = 105;
struct E {
int to, nt;
} e[N * N * 4];
struct A {
int x, y;
} ans[N * N];
int sum, n, m, mp[N][N], num1, pj[N][N], f[N * N], hd[N * N], cnt, ans1, vis[N * N], dx[4] = { 0, 0, 1, -1 } , dy[4] = { -1, 1, 0, 0 };
char ch;
void add(int x, int y) { e[++cnt].to = y, e[cnt].nt = hd[x], hd[x] = cnt; }
int xyl(int x) {
int y;
for (int i = hd[x]; i; i = e[i].nt) {
y = e[i].to;
if (vis[y])
continue;
vis[y] = 1;
if (!f[y] || xyl(f[y])) {
f[f[x]] = 0;
f[y] = x;
f[x] = y;
return true;
}
}
return false;
}
int read () {
int val = 0 , fu = 1;
char ch = getchar ();
while (ch < '0' || ch >'9') {
if (ch == '-') fu = -1;
ch = getchar ();
}
while (ch >= '0' && ch <= '9') {
val = val * 10 + (ch - '0');
ch = getchar ();
}
return val * fu;
}
int main() {
scanf("%d%d", &n, &m);
fu(i, 1, n) {
fu(j, 1, m) {
ch = getchar();
while (ch != '.' && ch != '#') ch = getchar();
mp[i][j] = (ch == '#');
}
}
fu(i, 1, n)
fu(j, 1, m)
pj[i][j] = ++num1;
int x, y;
fu(i, 1, n) {
fu(j, 1, m) {
if (mp[i][j])
continue;
fu(k, 0, 3) {
x = dx[k] + i, y = dy[k] + j;
if (x < 1 || x > n || y < 1 || y > m || mp[x][y])
continue;
add(pj[i][j], pj[x][y]);
}
}
}
fu(i, 1, n) {
fu(j, 1, m) {
if (f[pj[i][j]] || mp[i][j])
continue;
memset(vis, 0, sizeof(vis));
sum += xyl(pj[i][j]);
}
}
fu(i, 1, n) {
fu(j, 1, m) {
if (mp[i][j])
continue;
memset(vis, 0, sizeof(vis));
if (!f[pj[i][j]] || xyl(f[pj[i][j]])) {
ans[++ans1].x = i, ans[ans1].y = j;
}
}
}
puts(ans1 ? "WIN" : "LOSE");
fu(i, 1, ans1) printf("%d %d\n", ans[i].x, ans[i].y);
return 0;
}

P4055 [JSOI2009] 游戏(博弈论 、最大匹配)的更多相关文章

  1. P4055 [JSOI2009]游戏

    传送门 把这个图给黑白染色然后建二分图,如果有完备匹配那么就gg,否则放在所有的非匹配点都可以 简单来说的话就是放在非匹配点,那么对手的下一步必定移到一个匹配点,然后自己可以把它移到这个匹配点所匹配的 ...

  2. BZOJ1443: [JSOI2009]游戏Game

    如果没有不能走的格子的话,和BZOJ2463一样,直接判断是否能二分图匹配 现在有了一些不能走的格子 黑白染色后求出最大匹配 如果是完备匹配,则无论如何后手都能转移到1*2的另一端,故先手必输 否则的 ...

  3. JSOI2009 游戏

    1443: [JSOI2009]游戏Game Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 557  Solved: 251[Submit][Stat ...

  4. POJ.1067 取石子游戏 (博弈论 威佐夫博弈)

    POJ.1067 取石子游戏 (博弈论 威佐夫博弈) 题意分析 简单的威佐夫博弈 博弈论快速入门 代码总览 #include <cstdio> #include <cmath> ...

  5. HDU.2516 取石子游戏 (博弈论 斐波那契博弈)

    HDU.2516 取石子游戏 (博弈论 斐波那契博弈) 题意分析 简单的斐波那契博弈 博弈论快速入门 代码总览 #include <bits/stdc++.h> #define nmax ...

  6. BZOJ1443 [JSOI2009]游戏Game 【博弈论 + 二分图匹配】

    题目链接 BZOJ1443 题解 既然是网格图,便可以二分染色 二分染色后发现,游戏路径是黑白交错的 让人想到匹配时的增广路 后手要赢[指移动的后手],必须在一个与起点同色的地方终止 容易想到完全匹配 ...

  7. BZOJ 1443 [JSOI2009]游戏Game ——博弈论

    好题. 首先看到棋盘,先黑白染色. 然后就是二分图的经典模型. 考虑最特殊的情况,完美匹配,那么先手必胜, 因为无论如何,先手走匹配边,后手无论走哪条边,总有对应的匹配边. 如果在不在最大匹配中出发, ...

  8. BZOJ:1443: [JSOI2009]游戏Game

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1443 反正不看题解我是完全想不出系列…… 先把棋盘黑白染色,也就是同一对角线上颜色相同,使 ...

  9. [JSOI2009]游戏Game

    Description Input 输入数据首先输入两个整数N,M,表示了迷宫的边长. 接下来N行,每行M个字符,描述了迷宫. Output 若小AA能够赢得游戏,则输出一行"WIN&quo ...

  10. 【BZOJ】1443: [JSOI2009]游戏Game

    [算法]博弈论+二分图匹配(最大流) [题解]方格图黑白染色得到二分图, 二分图博弈:当起点不属于某个最大匹配时,后手必胜. 问题转化为那些点不属于某个最大匹配. 先找到一个最大匹配,非匹配点加入答案 ...

随机推荐

  1. 2020.4.2关于java.pta的总结

    0.前言 本文是有关pta2020.3至2020.4所有面向对象程序课程(java)共三次作业的阶段性总结,是java学习最开始起步时期的成果. 1.作业过程总结 这三次作业,是从c++过渡到java ...

  2. git练习网站(图形化版)

    https://learngitbranching.js.org/?locale=zh_CN

  3. Python之常用数据类型详解

    tuple 元组 1 # 定义 2 temp = (2, ) # 规范定义,单个元素的元组 3 tem = 2, # 可行,但不规范定义 4 tep = () # 空元组 5 6 tp = (1, ' ...

  4. 快速排序(Java分治法)

    快速排序(Java分治法) 文章目录 快速排序(Java分治法) 0. 分治策略 1.思路步骤 2.代码 3.复杂度分析 3.1 最好情况 3.2 最坏情况 3.3 平均情况 3.4 性能影响因素 4 ...

  5. BlenderGIS记录

    blender GIS 的插件名:"3Dview:blenderGIS" 具体使用方法看文档. 选择地图时选择bing地图会快一点.如果能挂梯子可以选择google地图 shift ...

  6. python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记

    (如想转载,请联系博主或贴上本博地址) 此篇为上一篇pyqt5图像压缩小工具改良版.因为比较简单,下面直接贴上代码. 效果图: # -*- coding: utf-8 -*- # Form imple ...

  7. Python:合并两个列表成为一个list

    如何合并两个列表,今天就来探讨一下: 方法一:最笨的方法实现 list1=[1,2,3]list2=[4,5,6]new_list=[]for item in list1: new_list.appe ...

  8. 明解STM32—GPIO理论基础知识篇之八种工作模式

    一.引言 在之前围绕STM32的GPIO的基本结构进行了介绍,图1为STM32的5V容忍的GPIO口内部基本结构图,图2为GPIO的基本结构中各个模块部分的概述. 阅读GPIO基本结构的内容能够对GP ...

  9. AI 脸部美容,一键让你变瘦变美变老变年轻

    目录 项目效果 项目安装 安装环境 项目使用 项目效果 随着 AI 技术的发展,你不仅随时可以看到自己的老了之后的样子,还能看到自己童年的样子 随着这部分技术的开源,会有越来越多的应用,当然我觉得前景 ...

  10. windows2003 的安装以及安装时遇到的问题

    windows2003 的安装以及安装时遇到的问题 简介:Windows Server 2003是微软于2003年3月28日发布的基于Windows XP/NT5.1开发的服务器操作系统,并在同年4月 ...