您的位置:首页 > Web前端 > JavaScript

[JSOI2009]游戏Game

2018-01-05 09:00 176 查看

Description



Input

输入数据首先输入两个整数N,M,表示了迷宫的边长。 接下来N行,每行M个字符,描述了迷宫。

Output

若小AA能够赢得游戏,则输出一行"WIN",然后输出所有可以赢得游戏的起始位置,按行优先顺序输出 每行一个,否则输出一行"LOSE"(不包含引号)。

Sample Input

3 3

.##

...

#.#

Sample Output

WIN

2 3

3 2

HINT

对于100%的数据,有1≤n,m≤100。 对于30%的数据,有1≤n,m≤5。

这道题和[b][NOI2011]兔兔与蛋蛋游戏[/b][b]很像[/b]

[b]首先黑白染色[/b]

[b]同样的,对于一个点,如果它不一定构成最大匹配[/b]

[b]也就是ban掉该点后还有最大匹配[/b]

[b]那么它就是后手必胜[/b]

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct Node
{
int next,to;
}edge[100001];
int head[10001],num,n,m,x,y,id[101][101],cnt,cx[10001],tot;
bool vis[10001];
char s[1001];
void add(int u,int v)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
}
bool dfs(int x)
{int i;
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (vis[v]==0)
{
vis[v]=1;
if (!cx[v]||dfs(cx[v]))
{
cx[x]=v;cx[v]=x;
return 1;
}
}
}
return 0;
}
int main()
{int i,j,flag=0;
cin>>n>>m;
for (i=1;i<=n;i++)
{
scanf("%s",s+1);
for (j=1;j<=m;j++)
{
if (s[j]=='.') id[i][j]=++cnt;
}
}
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
if (id[i][j])
{
if (i>1&&id[i-1][j]) add(id[i][j],id[i-1][j]);
if (i<n&&id[i+1][j]) add(id[i][j],id[i+1][j]);
if (j>1&&id[i][j-1]) add(id[i][j],id[i][j-1]);
if (j<m&&id[i][j+1]) add(id[i][j],id[i][j+1]);
}
}
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
if (id[i][j]&&(i+j)%2)
{
memset(vis,0,sizeof(vis));
dfs(id[i][j]);
}
}
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
if (id[i][j])
{
memset(vis,0,sizeof(vis));
int u=id[i][j],v=cx[id[i][j]];
vis[u]=1;
if (!cx[u]||dfs(v))
{
cx[u]=0;
if (flag==0)
cout<<"WIN\n";
flag=1;
printf("%d %d\n",i,j);
}
}
}
if (flag==0) cout<<"LOSE";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: