The main idea: to give a bad point of the grid diagram, each time moving pieces to the adjacent lattice, the request lattice can not be repeated, ask if there is a winning strategy, if there is, output all the pieces can be placed on the initial position.
Idea: A very classic two-figure game model, will be black and white dyeing, it becomes a two-minute map. After the maximum match, if it is on the side of the match, each time the initiator from the left to the right, the hand will be able to come back from the right, so that is the initiator lost. See details: http://blog.sina.com.cn/s/blog_76f6777d0101inwe.html
Set up the network flow model, run the maximum flow, on the residual network from S can be found on the left side of the point and the right to find the point of T is to meet the requirements of the point.
CODE:
#define _crt_secure_no_warnings#include <queue> #include <cstdio> #include <cstring> #include < iostream> #include <algorithm> #define MAX 2100#define maxp 20100#define maxe 1000010#define S 0#define T (MAXP-1 ) #define INF 0x3f3f3f3fusing namespace Std;const int dx[] = {0,1,-1,0,0};const int dy[] = {0,0,0,1,-1};int Ans[maxp];bool V[maxp];struct maxflow{int head[maxp],total;int next[maxe],aim[maxe],flow[maxe];int Deep[MAXP]; Maxflow (): Total (1) {}void Add (int. x,int Y,int f) {next[++total] = head[x];aim[total] = Y;flow[total] = f;head[x] = total;} void Insert (int x,int y,int f) {//cout << x << ' << y << ' << f << endl; ADD (X,Y,F); ADD (y,x,0);} BOOL BFS () {static queue<int> Q;while (!q.empty ()) Q.pop () memset (deep,0,sizeof (deep));d eep[s] = 1;q.push (S); while (!q.empty ()) {int x = Q.front (), Q.pop (), for (int i = head[x]; i; i = Next[i]) if (Flow[i] &&!deep[aim[i]) {de Ep[aim[i]] = deep[x] + 1;q.push (aim[i]); if (aim[i] = = T) rEturn true;}} return false;} int dinic (int x,int f) {if (x = = T) return F;int temp = f;for (int i = head[x]; i; i = Next[i]) if (Flow[i] && Deep[aim [i]] = = Deep[x] + 1 && temp) {int away = Dinic (Aim[i],min (flow[i],temp)); if (!away) deep[aim[i]] = 0;flow[i]-= away ; flow[i^1] + = away;temp-= away;} return f-temp;}} Solver;int M,n;char s[max][max];int num[max][max];bool col[maxp];bool t[maxp];void DFS (int x,int f) {t[x] = true;if (col[x ] = = F && x! = S && x! = T) ans[++ans[0]] = x;for (int i = solver.head[x]; i; i = Solver.next[i]) if (solver.f Low[i] = = f &&!t[solver.aim[i]]) DFS (solver.aim[i],f);} void Getans () {DFS (s,1); memset (t,false,sizeof (t));D FS (t,0);} inline void OutPut (int x) {printf ("%d%d\n", (x-1)/n + 1, (x-1)% n + 1);} int main () {cin >> m >> n;for (int i = 1; I <= m; ++i) scanf ("%s", S[i] + 1); int cnt = 0;for (int i = 1; I <= M ++i) for (int j = 1; J <= N, ++j) num[i][j] = ++cnt;for (int i = 1; I <= m; ++i) for (int j = 1; j <= N; ++j{if (s[i][j] = = ' # ') continue;if (! ( (i + j) &1)) Solver. Insert (s,num[i][j],1), col[num[i][j]] = true;else {solver. Insert (num[i][j],t,1); continue;} for (int k = 1; k <= 4; ++k) {int FX = i + dx[k],fy = j + dy[k];if (!fx | |!fy | | FX > M | | fy > N) continue;if (s[fx ][fy] = = '. ') Solver. Insert (num[i][j],num[fx][fy],1);}} while (solver. BFS ()) Solver. Dinic (S,inf); Getans (), if (!ans[0]) puts ("Lose"), else {puts ("WIN"); sort (ans + 1,ans + ans[0] + 1); for (int i = 1; I <= ans[0]; ++i) OUTPU T (Ans[i]);} return 0;}
Bzoj 1443 jsoi 2009 Games Game binary diagram + game