HDU-1524-A Chess Game && POJ-2425 【sg】
2017-08-31 18:09
393 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1524
Problem Description
Let's design a new chess game. There are N positions to hold M chesses in this game. Multiple chesses can be located in the same position. The positions are constituted as a topological graph, i.e. there are directed edges connecting some positions, and no
cycle exists. Two players you and I move chesses alternately. In each turn the player should move only one chess from the current position to one of its out-positions along an edge. The game does not end, until one of the players cannot move chess any more.
If you cannot move any chess in your turn, you lose. Otherwise, if the misfortune falls on me... I will disturb the chesses and play it again.
Do you want to challenge me? Just write your program to show your qualification!
Input
Input contains multiple test cases. Each test case starts with a number N (1 <= N <= 1000) in one line. Then the following N lines describe the out-positions of each position. Each line starts with an integer Xi that is the number of out-positions for the position
i. Then Xi integers following specify the out-positions. Positions are indexed from 0 to N-1. Then multiple queries follow. Each query occupies only one line. The line starts with a number M (1 <= M <= 10), and then come M integers, which are the initial positions
of chesses. A line with number 0 ends the test case.
Output
There is one line for each query, which contains a string "WIN" or "LOSE". "WIN" means that the player taking the first turn can win the game according to a clever strategy; otherwise "LOSE" should be printed.
Sample Input
4
2 1 2
0
1 3
0
1 0
2 0 2
0
4
1 1
1 2
0
0
2 0 1
2 1 1
3 0 1 3
0
Sample Output
WIN
WIN
WIN
LOSE
WIN
题目分析:
有n个位置,存在拓扑关系,也就是说:在一个有向无环图上有n个顶点,有两个人,每次沿着有向图的边只能将任意一颗棋子移动一步,如果到某一步玩家不能移动时,那么这个人就输了.把所有顶点的SG值都计算出来,然后对每个棋子的SG值进行异或运算,如果异或值为0就是先手必败态。
关于输入:输入一个n,接下来构建有向图,n行表示0-n-1为起点的有向边,每行的第一个数表示与起点相连的终点个数,之后是各个终点。
接下来就要在有向图的顶点上放棋子。输入m,表示有m个棋子,之后m个数是棋子所在的顶点编号,m为0时结束。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int sg[1005];
int mp[1005][1005];
int get_sg(int xx)
{
if(sg[xx]!=-1)
return sg[xx];
bool visit[1005];
memset(visit,0,sizeof(visit));
int i,j;
for(i=0;i<n;i++)
{
if(mp[xx][i]==1)
{
get_sg(i);
visit[sg[i]]=1;
}
}
for(i=0;;i++)
{
if(!visit[i])
{
sg[xx]=i;
break;
}
}
return sg[xx];
}
int main()
{
int x,xi,m,k;
int i,j;
while(~scanf("%d",&n))
{
memset(sg,-1,sizeof(sg));
memset(mp,0,sizeof(mp));
for(i=0;i<n;i++)
{
scanf("%d",&x);
if(x==0)
sg[i]=0;
while(x--)
{
scanf("%d",&xi);
mp[i][xi]=1;
}
}
while(~scanf("%d",&m))
{
if(m==0)
break;
int ans=0;
while(m--)
{
scanf("%d",&k);
ans^=get_sg(k);
}
if(ans)
cout<<"WIN"<<endl;
else
cout<<"LOSE"<<endl;
}
}
return 0;
}
A Chess Game
Problem DescriptionLet's design a new chess game. There are N positions to hold M chesses in this game. Multiple chesses can be located in the same position. The positions are constituted as a topological graph, i.e. there are directed edges connecting some positions, and no
cycle exists. Two players you and I move chesses alternately. In each turn the player should move only one chess from the current position to one of its out-positions along an edge. The game does not end, until one of the players cannot move chess any more.
If you cannot move any chess in your turn, you lose. Otherwise, if the misfortune falls on me... I will disturb the chesses and play it again.
Do you want to challenge me? Just write your program to show your qualification!
Input
Input contains multiple test cases. Each test case starts with a number N (1 <= N <= 1000) in one line. Then the following N lines describe the out-positions of each position. Each line starts with an integer Xi that is the number of out-positions for the position
i. Then Xi integers following specify the out-positions. Positions are indexed from 0 to N-1. Then multiple queries follow. Each query occupies only one line. The line starts with a number M (1 <= M <= 10), and then come M integers, which are the initial positions
of chesses. A line with number 0 ends the test case.
Output
There is one line for each query, which contains a string "WIN" or "LOSE". "WIN" means that the player taking the first turn can win the game according to a clever strategy; otherwise "LOSE" should be printed.
Sample Input
4
2 1 2
0
1 3
0
1 0
2 0 2
0
4
1 1
1 2
0
0
2 0 1
2 1 1
3 0 1 3
0
Sample Output
WIN
WIN
WIN
LOSE
WIN
题目分析:
有n个位置,存在拓扑关系,也就是说:在一个有向无环图上有n个顶点,有两个人,每次沿着有向图的边只能将任意一颗棋子移动一步,如果到某一步玩家不能移动时,那么这个人就输了.把所有顶点的SG值都计算出来,然后对每个棋子的SG值进行异或运算,如果异或值为0就是先手必败态。
关于输入:输入一个n,接下来构建有向图,n行表示0-n-1为起点的有向边,每行的第一个数表示与起点相连的终点个数,之后是各个终点。
接下来就要在有向图的顶点上放棋子。输入m,表示有m个棋子,之后m个数是棋子所在的顶点编号,m为0时结束。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int sg[1005];
int mp[1005][1005];
int get_sg(int xx)
{
if(sg[xx]!=-1)
return sg[xx];
bool visit[1005];
memset(visit,0,sizeof(visit));
int i,j;
for(i=0;i<n;i++)
{
if(mp[xx][i]==1)
{
get_sg(i);
visit[sg[i]]=1;
}
}
for(i=0;;i++)
{
if(!visit[i])
{
sg[xx]=i;
break;
}
}
return sg[xx];
}
int main()
{
int x,xi,m,k;
int i,j;
while(~scanf("%d",&n))
{
memset(sg,-1,sizeof(sg));
memset(mp,0,sizeof(mp));
for(i=0;i<n;i++)
{
scanf("%d",&x);
if(x==0)
sg[i]=0;
while(x--)
{
scanf("%d",&xi);
mp[i][xi]=1;
}
}
while(~scanf("%d",&m))
{
if(m==0)
break;
int ans=0;
while(m--)
{
scanf("%d",&k);
ans^=get_sg(k);
}
if(ans)
cout<<"WIN"<<endl;
else
cout<<"LOSE"<<endl;
}
}
return 0;
}
相关文章推荐
- SG 函数 hdu1524 & poj 2425 hdu1524 A Chess Game
- POJ 2425 && HDU 1524 A Chess Game(博弈论)
- poj 3694&&hdu 2460 (手写递归栈版的tarjan)
- POJ 1573 && hdu 1035 Robot Motion【简单模拟】
- POJ 2141 && HDU 2716 Message Decowding(水~)
- HDU 1159 & POJ 1458 Common Subsequence 【LCS】
- POJ 1463 && HDU 1054 Strategic Game(树形DP)
- hdu 1542 & poj 1151 Atlantis 线段树扫描线求矩形面积并
- POJ 3340 & HDU 2410 Barbara Bennett's Wild Numbers(数学)
- POJ 2909 && HDU 1397 Goldbach's Conjecture(数论)
- hdu 1151 &&poj 1422 Air Raid (二分图匹配 最小路径覆盖)
- POJ 1201 && HDU 1384 Intervals(差分约束系统)
- 线段树求矩形面积并 方法详解 (扫描线)HDU 1542 & HDU 3265 & POJ 1151
- POJ 1964&HDU 1505&HOJ 1644 City Game(最大0,1子矩阵和总结)
- 【POJ】3169 Layout & 【HDU】3592 World Exhibition 差分约束
- POJ 1177 & HDU 1828 Picture(扫描线 + 求周长)
- hdu 4071& poj 3873 & zoj 3386 & uva 12197 Trick or Treat 三分法
- POJ 3650 & ZJU 2932 & HDU 2719 The Seven Percent Solution(模拟)
- poj 3468 & hdu 1698 【线段树-区间更新】
- poj 1151 && hdu 1542 求矩形面积并(线段树)