历届试题 约数倍数选卡片 博弈论?dfs
2017-04-06 22:47
453 查看
问题描述
闲暇时,福尔摩斯和华生玩一个游戏:
在N张卡片上写有N个整数。两人轮流拿走一张卡片。要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数。例如,某次福尔摩斯拿走的卡片上写着数字“6”,则接下来华生可以拿的数字包括:
1,2,3, 6,12,18,24 ....
当轮到某一方拿卡片时,没有满足要求的卡片可选,则该方为输方。
请你利用计算机的优势计算一下,在已知所有卡片上的数字和可选哪些数字的条件下,怎样选择才能保证必胜!
当选多个数字都可以必胜时,输出其中最小的数字。如果无论如何都会输,则输出-1。
输入格式
输入数据为2行。第一行是若干空格分开的整数(每个整数介于1~100间),表示当前剩余的所有卡片。
第二行也是若干空格分开的整数,表示可以选的数字。当然,第二行的数字必须完全包含在第一行的数字中。
输出格式
程序则输出必胜的招法!!
样例输入
2 3 6
3 6
样例输出
3
样例输入
1 2 2 3 3 4 5
3 4 5
样例输出
4
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int a[12000],b[12000],vis[12000],n,m;
vector<int> g[12000];
bool dfs(int i){
vis[i]=1;
for(int j=g[i].size()-1;j>=0;j--)
if(!vis[g[i][j]]){
// vis[j]=1;
if(dfs(g[i][j]))
{
vis[i]=0;
return false;
}
// vis[j]=0;;
}
vis[i]=0;
return true;
}
int main(){
while(~scanf("%d",a+n)){
for(int i=0;i<n;i++)
if(a[i]%a
==0||a
%a[i]==0){
g[i].push_back(n);
g
.push_back(i);
}
n++;
if(getchar()=='\n')
break;
}
while(~scanf("%d",b+m)){
m++;
if(getchar()=='\n')
break;
}
for(int i=0;i<m;i++){
// memset(vis,0,sizeof(vis));
for(int j=0;j<n;j++)
if(b[i]==a[j]){
// vis[j]=1;
if(dfs(j)){
cout<<a[j]<<endl;
return 0;
}
}
}
cout<<-1<<endl;
return 0;
}
闲暇时,福尔摩斯和华生玩一个游戏:
在N张卡片上写有N个整数。两人轮流拿走一张卡片。要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数。例如,某次福尔摩斯拿走的卡片上写着数字“6”,则接下来华生可以拿的数字包括:
1,2,3, 6,12,18,24 ....
当轮到某一方拿卡片时,没有满足要求的卡片可选,则该方为输方。
请你利用计算机的优势计算一下,在已知所有卡片上的数字和可选哪些数字的条件下,怎样选择才能保证必胜!
当选多个数字都可以必胜时,输出其中最小的数字。如果无论如何都会输,则输出-1。
输入格式
输入数据为2行。第一行是若干空格分开的整数(每个整数介于1~100间),表示当前剩余的所有卡片。
第二行也是若干空格分开的整数,表示可以选的数字。当然,第二行的数字必须完全包含在第一行的数字中。
输出格式
程序则输出必胜的招法!!
样例输入
2 3 6
3 6
样例输出
3
样例输入
1 2 2 3 3 4 5
3 4 5
样例输出
4
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int a[12000],b[12000],vis[12000],n,m;
vector<int> g[12000];
bool dfs(int i){
vis[i]=1;
for(int j=g[i].size()-1;j>=0;j--)
if(!vis[g[i][j]]){
// vis[j]=1;
if(dfs(g[i][j]))
{
vis[i]=0;
return false;
}
// vis[j]=0;;
}
vis[i]=0;
return true;
}
int main(){
while(~scanf("%d",a+n)){
for(int i=0;i<n;i++)
if(a[i]%a
==0||a
%a[i]==0){
g[i].push_back(n);
g
.push_back(i);
}
n++;
if(getchar()=='\n')
break;
}
while(~scanf("%d",b+m)){
m++;
if(getchar()=='\n')
break;
}
for(int i=0;i<m;i++){
// memset(vis,0,sizeof(vis));
for(int j=0;j<n;j++)
if(b[i]==a[j]){
// vis[j]=1;
if(dfs(j)){
cout<<a[j]<<endl;
return 0;
}
}
}
cout<<-1<<endl;
return 0;
}
相关文章推荐
- 【 历届试题 约数倍数选卡片】(博弈论)
- 蓝桥杯 历届试题 约数倍数选卡片 求大神指点 首先声明,我的代码有问题!不喜勿进,若有意向,可以讨论,我百度不到这道题的题解
- 蓝桥杯历届试题 约数倍数选卡片
- 蓝桥杯历届试题——约数倍数选卡片(博弈论+dfs)
- 蓝桥杯 历届试题 约数倍数选卡片 求大神指点 首先声明,我的代码有问题,!不喜勿进,若有意向,可以讨论,我百度不到这道题的题解
- 历届试题 约数倍数选卡片
- 算法笔记_184:历届试题 约数倍数选卡片(Java)
- 1610:历届试题 约数倍数选卡片
- 约数倍数选卡片---博弈论
- 约数倍数选卡片 博弈论
- 蓝桥杯 历届试题 剪格子 (dfs回溯)
- 蓝桥杯 约数倍数选卡片
- 蓝桥杯--历届试题 剪格子(DFS)
- 历届试题网络寻路(dfs)
- 蓝桥杯 历届试题 地库取宝(深搜 dfs)---------------------C语言——菜鸟级
- 蓝桥杯 历届试题 网络寻路 (dfs)
- 历届试题 邮局(dfs+暴力)
- 历届试题 搭积木 (dfs 优化)
- 历届试题 高僧斗法 博弈论 尼姆
- 蓝桥杯练习系统历届试题 带分数 dfs