题目请点这里
题解:
这是一道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 ;
}