傳送門
直接博弈論dfs可以得到75分(然鵝我博弈論學的很pie)
#include#define ll long long75分然後正解是二分圖。。。哇這誰想得到是二分圖#define inf 10000
using
namespace
std;
intread()
while(s>='
0'&&s<='9')
return x*f;
} char s[45
];int lr=,ud=,ans[1003],tu[43][43],sg[43
];int x,y,tot=0
,n,m;
int dfs(int x,int y,int
op)//
往下遞迴得到每乙個局面,判斷其為必勝還是必敗
swap(tu[xx][yy],tu[x][y]);
}return0;
}int
main()
}int op=read();
for(int i=1;i<=op;++i)
printf(
"%d\n
",tot);
for(int i=1;i<=tot;++i)
printf(
"%d\n
",ans[i]);
} /*
*/
讓我們認真分析一下:
每一次順序移動白格黑格,當最後無法移動停止,且每乙個格仔只會走過一次(感**知)相當於是黑白交替格仔染色—>想到二分圖。
與其說是每次交換空格和其他黑白格,不如說是空格在黑白格上走。(第一步在空格本身上)
我們可以把第一步認為是黑格,然後交替走黑白格,如果最後走到黑格,說明兔兔輸了(兔兔移動白格)。
然後二分圖匹配保證了最後走到的一定是白格,因為從黑格出發(要求每一條路都是奇數步)
走格仔相當於是在增廣路上走,如果當前x,y一定在最大匹配上(在增廣路上而且沒有其他的增廣路可以替代它了),說明現在是必勝態。
然後對於每一步進行判斷,如果兔兔和蛋蛋的第i步都是必勝態,說明兔兔在走第i步之前是必勝態,走了第i步後蛋蛋就是必勝態了。
滿足題目要求,累計答案。
#include#define n 43二分圖ac#define ll long long
#define inf 10000
using
namespace
std;
intread()
while(s>='
0'&&s<='9')
return x*f;
} struct
edgew[n*n*4
];char
s[n];
int lr=,ud=,ans[1003],tu[n][n],head[n*n],ord[n][n],vis[n*n],match[n*n],ban[n*n],win[1003
];int x,y,tot=0,n,m,ndnum=0,res=0,timer=0
;void add(int a,int
b)void jian_tu()//
建二分圖
}}int dfs(int
x) }
return0;
}int
main()
}jian_tu();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(tu[i][j])timer++,dfs(ord[i][j]);
int op=read();
for(int i=1;i<=op*2;++i)
x=read();y=read();
}for(int i=1;i<=op;++i)
if(win[2*i-1]&&win[2*i])ans[++res]=i;
printf(
"%d\n
",res);
for(int i=1;i<=res;++i)
printf(
"%d\n
",ans[i]);
}
Noi2011 兔兔與蛋蛋
題目 題解容易想到空格移動的路徑是不會自交的。因為空格移動的路徑是黑白棋相間的 所以對棋盤進行黑白染色,建立二分圖 如果黑白兩格上的棋子不一樣則可以連邊 如果乙個人 a 將空格移入了乙個在最大匹配內的點,那麼它的對手 b 就可以沿著匹配邊前進 否則就相當於找到了一條新的匹配邊 而a只能沿著非匹配邊前...
NOI2011 洛谷 兔兔與蛋蛋遊戲
初見安 這裡是傳送門 洛谷p1971 noi2011 兔兔與蛋蛋遊戲 這種題啊 就只能多悟,才能看到了就知道怎麼做 bushi。看題目的操作 每次交替移動黑白棋子。然後就可以想到二分圖了 什麼鬼。空白格仔從初始到終點走的路徑上的格仔都是與之交換過的,並且黑白相間,該路徑與以前走過的路徑不可能有交點。...
NOI 兔兔與蛋蛋的遊戲
二維的乙個最大匹配 program game type rec record x,y longint end const numm rec x 0 y 0 dx array 1.4 of integer 0,1,0,1 dy array 1.4 of integer 1,0,1,0 var link...