POJ 2599 A funny game [DFS博弈]

 题意:给定无向图,两个人依次决定移动位置,若一方无路可走则为输,判断先行者的输赢及赢时第一步的走向(若多路皆可,输出较小的数,注意排序)走过的位置会自动销毁,即记忆化搜索。

思路:DFS记忆化搜索,对访问点排序,bool DFS(int k,bool who,node vis)中k表示要访问的位置编号,who为1表示先行者,0表示次行者,vis记录访问。返回true,先行者赢。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N,K;
vector<int> s[1001];
struct node{
    bool visit[1002];
}vis;
bool dfs(int k,int who,struct node vis){
    if(vis.visit[k]==true&&who==0) return true;
    else if(vis.visit[k]==true&&who==1) return false;
    vis.visit[k]=true;
    if(s[k].size()==0&&who==1) return true;
    else if(s[k].size()==0&&who==0) return false;
    for(int j=0;j<s[k].size();j++){
        if(who==0){
            if(dfs(s[k][j],1,vis)==true) return true;
        }
        else if(who==1){
            if(dfs(s[k][j],0,vis)==false) return false;
        }
    }
    if(who==0) return false;
    else return true;
}
int main(){
    while(scanf("%d%d",&N,&K)!=EOF){
        int a,b;
        for(int i=0;i<N-1;i++){
            scanf("%d%d",&a,&b);
            s[a].push_back(b);
            s[b].push_back(a);
        }
        int land=1122;
        for(int i=0;i<1002;i++) vis.visit[i]=false;
        vis.visit[K]=true;
        sort(s[K].begin(),s[K].end());
        for(int j=0;j<s[K].size();j++){
            if(dfs(s[K][j],1,vis)==true ){
                land=s[K][j];
                break;
            }
        }
        if(land==1122) printf("First player loses\n");
        else printf("First player wins flying to airport %d\n",land);
        for(int i=0;i<1001;i++) s[i].clear();
    }
    return 0;
}
/*测试:
Sample Input
4 3
3 2 
3 1
1 4
Sample Output
First player wins flying to airport 2
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值