ZOJ_1003 Crashing Balloon(DFS)

题目请点这里
题解:
这是一道DFS的题目,最开始想了很久,卡在了如何判断两个数确定是冲突的,之后参考同学的思路,从头开始尝试让两个数分别对这些数取余,构造一棵树,然后看能到达哪种结果,依据树的分支判断结果。
首先理清楚关系:(num1>num2)
如果num2不能约到1,此时一定是num1赢;
如果num2能约到1,就需要看num1的情况,
如果num1能约到1,则num1赢,如果num1约不到1,则num2赢;
之所以以num2的角度去判断是因为如果遇到关键数(num1,num2都需要),会先给num2.也就是说只需要num2的分支能达到就可以,对num2要特判。
代码实现:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define LL long long

using namespace std;

int num1,num2;
bool finish;
bool flag1,flag2;
int visit[100];

void dfs(LL n1,LL n2,int num);

int main(){
    while( scanf("%d%d",&num1,&num2) != EOF ){
        finish = false;
        flag1 = flag2 = false;
        memset(visit,0,sizeof(visit));
        if( num1 < num2 ){
            swap(num1,num2);
        }
        dfs(num1,num2,2);
        if( flag1 || !flag2 ){
            printf("%d\n",num1);
        }
        else{
            printf("%d\n",num2);
        }
    }
    return 0;
}

void dfs(LL n1,LL n2,int num){
    if( flag2 && flag1 ){
        return ;
    }
    if( num > 100 ){
        return ;
    }
    if( n2 == 1 ){
        flag1 = true;
    }
    if( n2 == 1 && n1 == 1 ){
        flag2 = true;
        flag1 = true;
        return ;
    }
    if( n1 % num == 0 ){
        dfs(n1/num,n2,num+1);
    }
    if( n2 % num == 0 ){
        dfs(n1,n2/num,num+1);
    }
    dfs(n1,n2,num+1);
    return ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值