约数倍数卡片 java_约数倍数选卡片

1 /*

2 * 万能的搜索...3 */

4 #include

5 #include

6 #include

7 #include

8 #include

9 #include

10 #include

11

12 using namespacestd;13

14 const int MAX = 109;15 vectorv[MAX];16 vectorc;17 //这里的状态标记不能这样标记, 应标记出现多少次

18 intbook[MAX];19

20 bool DFS(intn)21 { //寻找 n 的约数倍数, 如果没有, 就会直接返回true(赢了)22 //1;

23 for(int i=v[n].size()-1;i>=0;i--){24 int now =v[n].at(i);25 if(book[now]){ //判断当前数有没有用完

26 book[now]--;27 bool win =DFS(now);28 book[now]++;29 if(win) return false;30 }31 }32

33 return true;34 }35

36 intmain()37 {38 intx;39 strings;40

41 getline(cin, s);42 stringstream ss(s);43 //统计每个数出现的次数

44 while(ss>>x) book[x]++;45 getline(cin, s);46 stringstream str(s);47 //我们可以选择的数

48 while(str>>x) c.push_back(x);49 //排序, 方便从小到大搜, 搜到的第一个就是最小的值

50 sort(c.begin(), c.end());51 //预处理可选数的约数和倍数

52 for(int i=1;i

58 for(int i=0;i

67 book[now]++;68 }69 }70 cout<

72 return 0;73 }74

75

76 /*

77 void Init(int *a, int *b, int la, int lb)78 { // 先把 a 约数倍数处理一下79 // 想办法去重...80 sort(a, a+la);81 // int *end = unique(a, a+la);82 // la = end - a;83 // a[i] 的约数和倍数是 a[j]84 for(int i=0;i 0 && a[i] == a[i-1])89 continue;90 else if(a[i]%a[j] == 0 || a[j]%a[i] == 0)91 v[a[i]].push_back(a[j]);92 }93

94 return;95 }96

97 int DFS(int start, int step)98 { cout<

116 int BFS(int start)117 { // 突然发现, 广搜好像不好做, 因为标记这关不太好处理118 // 可能会多次用到, 但是我们无法很好地还原前面一个点119 queue q;120 q.push(start);121 while(!q.empty())122 {123 int t = q.front();124 book[t]--;125 q.pop();126 int len = v[t].size();127 for(int i=0;i 1 && i != 0 && v[t].at(i) == v[t].at(i-1))131 continue; // 这个数已经进过一次队了132 int x = v[t].at(i);133 q.push(x);134 book[x]--;135 break;136

137 }138

139

140 break;141 }142

143

144 return -1;145 }146

147 void fun(int *a, int *b, int la, int lb)148 {149 sort(b, b+lb);150 memset(book, 0, sizeof(book));151 for(int i=0;i

154 int ret = 999;155 Init(a, b, la, lb);156 int c = 999;157 for(int i=lb-1;i>=0;i--){158 memset(book, 0, sizeof(book));159 c = DFS(b[i], 1);160 cout<"<

166 int main()167 {168 string s1, s2;169 int i = 0, j = 0;170

171 getline(cin, s1);172 stringstream ss1(s1);173 while(ss1>>a[i++]);174

175 getline(cin, s2);176 stringstream ss2(s2);177 while(ss2>>b[j++]);178

179 fun(a, b, i-1, j-1);180

181 return 0;182 }183

184 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值