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 */