HDU 4101 Ali and Baba

一道绝好的题目,比赛开始时候看这题以为是博弈,又很麻烦,就没去做,后来比赛后期时只有这题能做了就开想这题,发现这货不是博弈...

如果一开始就能拿到宝藏那么就是Ali胜,否则的话两个人会在敲破围绕宝藏的那层石头前一直磨叽把其他能打到的石头全部敲掉,这样我们求出之前的敲击次数的和然后判奇偶就行了

做法是先从宝藏点dfs/bfs出一个能拿到宝藏的空白范围A,然后从边缘点bfs(dfs会爆栈,要手工加大栈区),扫到A的范围为止(这个范围为B),得到的那个相交层就是那个最后一步的范围,为C。A范围内的总和加上C范围每一个石头减1的和再加1,就是的总的步数,判奇偶得到胜者。代码如下~~

 1 #include<cstdio>
2 #include<cstring>
3 #include<queue>
4 using namespace std;
5 #define MP make_pair
6
7 int lx,ly;
8 int maze[305][305];
9 int dir[4][2]={{0,-1},{1,0},{0,1},{-1,0}};
10 bool ins[305][305];
11 bool vis[305][305];
12 int ans;
13
14 void bfs(int x,int y){
15 queue<pair<int,int> > que;
16 que.push(MP(x,y));
17 while(!que.empty()){
18 int ux=que.front().first;
19 int uy=que.front().second;
20 que.pop();
21 for(int i=0;i<4;i++){
22 int tx=ux+dir[i][0];
23 int ty=uy+dir[i][1];
24 if(tx<0||ty<0||tx>=lx||ty>=ly) continue;
25 if(vis[tx][ty]) continue;
26 vis[tx][ty]=true;
27 if(ins[tx][ty]){
28 ans+=maze[tx][ty]-1;
29 }else{
30 ans+=maze[tx][ty];
31 que.push(MP(tx,ty));
32 }
33 }
34 }
35 }
36
37 bool dfs(int x,int y){
38 if(x==0||y==0||x==lx-1||y==ly-1) return true;
39 for(int i=0;i<4;i++){
40 int tx=x+dir[i][0];
41 int ty=y+dir[i][1];
42 if(tx<0||ty<0||tx>=lx||ty>=ly) continue;
43 if(ins[tx][ty]) continue;
44 ins[tx][ty]=true;
45 if(maze[tx][ty]) continue;
46 if(dfs(tx,ty)) return true;
47 }
48 return false;
49 }
50
51 int main(){
52 while(~scanf("%d%d",&lx,&ly)){
53 int sx,sy;
54 for(int i=0;i<lx;i++){
55 for(int j=0;j<ly;j++){
56 scanf("%d",&maze[i][j]);
57 if(maze[i][j]==-1){
58 sx=i; sy=j;
59 }
60 }
61 }
62
63 memset(ins,false,sizeof(ins));
64 if(dfs(sx,sy)){
65 puts("Ali Win");
66 }else{
67 ans=0;
68 memset(vis,false,sizeof(vis));
69 for(int i=0;i<lx;i++){
70 for(int j=0;j<ly;j++){
71 if(vis[i][j]) continue;
72 if(i==0||j==0||i==lx-1||j==ly-1){
73 vis[i][j]=true;
74 if(!ins[i][j]){
75 ans+=maze[i][j];
76 bfs(i,j);
77 }else if(ins[i][j]){
78 ans+=maze[i][j]-1;
79 }
80 }
81 }
82 }
83
84 if(ans&1) puts("Ali Win");
85 else puts("Baba Win");
86 }
87 }
88 }



posted @ 2011-10-30 21:25  Amb@HDU  阅读(866)  评论(2编辑  收藏  举报