POJ 2425 A Chess Game(博弈)

来源:互联网 发布:东方红大数据 编辑:程序博客网 时间:2024/05/22 03:32

POJ 2425 A Chess Game

当前棋子没有可以到达的点的时候sg=0(败)
以此状态转移 ,每个棋子的SG都可以求出来 

        也就是基础的nim博弈

C++

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<vector>#include<algorithm>#define mem(a,x) memset(a,x,sizeof(a))using namespace std;typedef long long ll;const int inf = 0x3f3f3f3f;/*当前棋子没有可以到达的点的时候sg=0(败)以此状态转移 ,每个棋子的SG都可以求出来 */int sg[1111];bool mp[1111][1111];int n;int SG(int u){if (~sg[u]) return sg[u];bool vis[1111];mem(vis,0);for (int v = 0;v < n;++v){if (mp[u][v]){vis[SG(v)] = 1;}}int g = 0;while (vis[g]) ++g;return sg[u] = g;}int main(){while (cin>>n){mem(mp,0);mem(sg,-1);for (int i = 0,to,v;i < n;++i){scanf("%d",&to);if (to == 0) sg[i] = 0;//无法移动else {while (to--){scanf("%d",&v);mp[i][v] = 1;}} }int m;while (cin>>m){if (!m) break;int s = 0,x;while (m--){scanf("%d",&x);s^=SG(x);}if (s) puts("WIN");else puts("LOSE"); }}return 0;}

java:

//package acm.poj2425;import java.util.*;//博弈public class Main {static int sg[] = new int[1111];static int mp[][] = new int [1003][1003];public static void init(){for (int i = 0;i < 1001;++i){Arrays.fill(mp[i],-1);}}static int n;public static int SG(int x){if (sg[x]!=-1) return sg[x];boolean nx[] = new boolean [1003];//自动全部赋值为0for (int i = 0;i < n;++i){if (mp[x][i]!=-1) {nx[SG(i)] = true;}}int g = 0;while (nx[g]) ++g;return sg[x] = g;}public static void main(String[] args) {// TODO Auto-generated method stub@SuppressWarnings("resource")Scanner in = new Scanner (System.in);while (in.hasNext()){n = in.nextInt();Arrays.fill(sg, -1);init();//Arrays.fill(mp, -1);for (int i =  0,k;i < n;++i){k = in.nextInt();if (k==0) sg[i] = 0;for (int j = 0,t;j < k;++j){t = in.nextInt();mp[i][t] = 1;}}while (true){int x = in.nextInt();if (x == 0) break;int ans = 0;for (int i = 0,t;i < x;++i){t = in.nextInt();ans ^= SG(t);}if (ans != 0){System.out.println("WIN");}else{System.out.println("LOSE");}}}}}


0 0
原创粉丝点击