for (int i = 0; i < 3; i++) { string l = lef[i]; string r = rig[i]; string z = zt[i]; if (!is_light) swap(l, r); switch (zt[i][0]) { case'e': if (l.find(iCoin)!=string::npos||r.find(iCoin)!=string::npos) returnfalse;//说明在平衡的地方找到了 肯定是真币 break; //现在枚举的是轻的 那么假币一定在上升的一方 //右边没找到那就肯定是真币 case'u': if (r.find(iCoin)==string::npos)returnfalse; break; //左边没找到那就肯定是真币 case'd': if (l.find(iCoin)==string::npos)returnfalse; break; default: break; } } returntrue; }
intmain() { int n; cin >> n;
while (n--) { int cmp[12] = { 0 };
for (int i = 0; i < 3; i++) { cin >> lef[i]>>rig[i]>> zt[i]; }
//枚举十二枚硬币 for (char iCoin = 'A'; iCoin <= 'L'; iCoin++) { //枚举假币为轻的情况 if (check(iCoin,true)) { cout << iCoin << " is the counterfeit coin and it is light. " << endl; break; } if (check(iCoin,false)) { cout << iCoin << " is the counterfeit coin and it is heavy. " << endl; break; } } lef.clear(), rig.clear(), zt.clear(); } return0; }
/*子集型回溯:进入dfs之后首先判断退出条件。之后是选或不选,对于1~9每个拨钟的方法,都可以选择拨或者 不拨!!然后是每个数字循环三次(最多只需要拨三次)。 判断,k>9的时候判断是否符合,符合判断最短,之前应记录每一步。 */ #include<bits/stdc++.h> usingnamespace std; vector<string>inf = { " ","ABDE" ,"ABC","BCEF","ADG","BDEFH","CFI","DEGH","GHI","EFHI"}; vector<int>ori(100); vector<int>movevec(100); vector<int>showvec(100); int u = 0; int si = 0; int mi = 50;
boolcheck(vector<int>ori)//检查是否符合条件(全为0 { for (int i = 0; i < 9; i++) { if (ori[i] != 0)returnfalse; } returntrue; }
voidmove(int k)//移动的距离 { for (int i = 0; i < inf[k].size(); i++) { ori[inf[k][i] - 'A'] = (ori[inf[k][i] - 'A'] + 1) % 4; } }
voiddfs(int k) { if (k > 9)//相当于循环9次 即枚举9种拨钟方法 { if (check(ori) && si < mi)//由于需要最少的次数所以用mi记录(当全为0时)最少次数 { mi = si; showvec = movevec;//记录最少次数的走法 由于是按顺序枚举 所以一定是从小到大的 } return; }
int k = 0; int a = 1; while (a * 2 <= n) { a *= 2; k++; } // 分解次方 // 这个地方要特判 因为只剩一个2的时候就直接输出了 而不是把k=1再拿去递归 if (a == 2) { cout << "2"; } else { cout << "2("; mf(k); cout << ")"; }
int x = n - a; if (x == 0)return; cout << "+"; mf(x); }
"""回溯,首先寻找结束条件,当等于24时退出递归,记得用绝对值和浮点数判断。 然后基本思路时把每种组合的加减乘除都算一遍,如何储存状态?使用一个列表,每次选出两个数,进行四则 运算,然后把剩余的没算的数也加进shengyu数组里面,递归运算。记得要回溯pop,还要排除b == 0的情况(被除数)。 """ import math defcal(lis): iflen(lis) == 1and math.fabs(lis[0] - 24) < 1e-6: returnTrue for i inrange(len(lis)): for j inrange(len(lis)):
if i == j: continue
a = lis[i] b = lis[j] shengyu = [] for k inrange(len(lis)): if k != i and k != j: shengyu.append(lis[k]) if b == 0: continue sum1 = a + b sub = a - b mul = a * b div = a / b left = [sum1, sub, mul, div] for x in left: shengyu.append(x) if cal(shengyu): returnTrue shengyu.pop()
returnFalse
whileTrue: lis = list(map(float, input().split())) if lis.count(0) == 4: break
"""因为需要找到所有房间中最大的,而一次搜索只能找一个房间的面积,可以遍历寻找未搜索过的房间。 深搜和广搜选哪个,一看是找面积最大的本来想用广搜但是判断条件写出来可能会比深搜麻烦很多,所以还是用深搜。 每次搜索之前,位运算判断该位是否可以走 """ import sys sys.setrecursionlimit(5000) N = 100 row = int(input()) col = int(input()) lis = [[0] * N for _ inrange(N)] color = [[0] * N for _ inrange(N)] maxArea = 0 maxRoom = 0
defmask1(x): return (x & 1) == 0
defmask2(x): return (x & 2) == 0
defmask3(x): return (x & 4) == 0
defmask4(x): return (x & 8) == 0
defdfs(a, b): global maxArea, maxRoom if color[a][b] != 0: return maxArea += 1 color[a][b] = maxRoom if mask1(lis[a][b]): dfs(a, b - 1) if mask2(lis[a][b]): dfs(a - 1, b) if mask3(lis[a][b]): dfs(a, b + 1) if mask4(lis[a][b]): dfs(a + 1, b)
for i inrange(row): a = list(map(int, input().split())) for j inrange(col): lis[i][j+1] = a[j]
retArea = 0
for i inrange(1,row+1): for j inrange(1,col+1): if color[i][j] == 0: maxArea = 0 maxRoom += 1 dfs(i, j) retArea = max(retArea, maxArea)
#include<bits/stdc++.h> usingnamespace std; int w, h, m; int maxCake[30][30][500]; constint inf = 0x3fffffff; intdfs(int w, int h, int m) { // 当m为0的时候返回当前的面积 if (m == 0)return w * h; // 记忆化搜索 if (maxCake[w][h][m])return maxCake[w][h][m];
int a, b, ans = inf;
for (int i = 0; i < m; i++) { for (int j = 1; j < w; j++) { a = dfs(j, h, i);// 切m 刀的蛋糕是由切i刀和m - i - 1刀组成的 w - i 最后会反转 可以变量所有情况 b = dfs(w - j, h, m - 1 - i); if (ans > max(a, b))ans = max(a, b);// 得到最大的蛋糕 取最小 } for (int j = 1; j < h; j++) { a = dfs(w, j, i); b = dfs(w, h - j, m - 1 - i); if (ans > max(a, b))ans = max(a, b); } } maxCake[w][h][m] = ans; return ans; }
intmain() { while (cin >> w >> h >> m) { if (w == h && h == m && m == 0)return0;