一.迷宫:广搜
1.数组清零:memset(flag, 0, sizeof(flag));
二.跳蚱蜢:广搜
1.广搜一般都要用node;
2.储存状态:用string,可以用swap函数;
3.状态(string)的去重:用set,insert(),allNode.find(nextStr) == allNode.end()
;
4.记得q.pop();
三.魔方状态:广搜
广搜:判断是否为广搜(每一步都有一个状态)、状态如何储存、状态如何变化、如何去重;
什么时候用深搜,什么时候用广搜:深搜:遍历、求所有状态;广搜:最后达到的是某个确定的状态、迷宫、连通块;
四.方块分割:深搜
void dfs(int x, int y) {
if(x == 0 || y == 0 || x == 6 || y == 6) {
ans++;
return;
}
vis[x][y] = 1;
vis[6 - x][6 - y] = 1;
for(int i = 0; i < 4; i++) {
int newx = x + newX[i];
int newy = y + newY[i];
if(newx >= 0 && newx <= 6 && newy >= 0 && newy <= 6 && vis[newx][newy] == 0) {
dfs(newx, newy);
}
}
vis[x][y] = 0;
vis[6 - x][6 - y] = 0;
}
五、六.代码填空:动态规划、递归
七.正则问题:递归
int f() {
int len = s.size();
int m = 0;
int tmp = 0;
while(pos < len) {
if(s[pos] == '(') {
pos++;
tmp += f();
}
else if(s[pos] == 'x') {
pos++;
tmp++;
}
else if(s[pos] == '|') {
pos++;
m = max(m, tmp);
tmp = 0;
}
else {
pos++;
m = max(m, tmp);
return m;
}
}
m = max(m, tmp);
return m;
}
八.包子凑数
1.解决“无限多种凑不出来”:
对于此方程,只有当A1、A2、……、An两两互质时才有解,若不互质则有无限多种凑不出,如何判断两两互质:利用 int gcd(a, b) 是否等于1;
2.解决“有限种凑不出来”:(为什么可以有边界?)
dp[0] = 1;
for(int i = 0; i < n; i++) {
for(int j = 0; j + a[i] < maxn; j++) {
if(dp[j] == 1) dp[j + a[i]] = 1;
}
}
九.分巧克力
枚举的优化:二分法
int binarySearch(int left, int right) {
int mid;
int cnt;
while(left <= right) {
mid = (left + right) / 2;
cnt = 0;
for(int i = 0; i < n; i++) {
int m = h[i] / mid;
int k = w[i] / mid;
cnt += m * k;
if(cnt >= k) break;
}
if(cnt >= k) {
left = mid + 1;
}
else right = mid - 1;
}
return mid;
}
为什么得到的结果一定是满足条件“cnt >= k”的边长中最大的:if(cnt >= k) { left = mid + 1; }
每当满足条件后,都向边长更大的地方搜寻,所以二分得到的结果是有序数列最后一个满足条件的数;
十.油漆面积
暴力法优化: