蓝桥杯练习系统 PREV-4 剪格子

来源:互联网 发布:怎样学好js 编辑:程序博客网 时间:2024/05/01 14:48

搜索题.

几处剪枝的地方:

1.当前和s大于总的和减去s,没有必要继续搜下去.

2.当前使用的格子大于等于最优解,没有必要继续搜下去.

下面的程序可能会剪成3部分,可是还是过了,不知为什么.

#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int MAX = 11;bool vis[MAX][MAX];int n, m, ans, val[MAX][MAX], sum;int dir_i[] = {-1, 1, 0, 0};int dir_j[] = {0, 0, -1, 1};void dfs(int i, int j, int s, int count){if(sum - s < s)return;if(count >= ans)return;if(sum - s == s){ans = min(ans, count);return;}for(int k = 0; k < 4; ++k){int ni = i + dir_i[k], nj = j + dir_j[k];if(ni >= 0 && ni < n && nj >= 0 && nj < m && !vis[ni][nj]){vis[i][j] = true;dfs(ni, nj, s + val[ni][nj], count + 1);vis[i][j] = false;}}}int main(int argc, char const *argv[]){ans = 101, sum = 0;cin >> m >> n;for(int i = 0; i < n; ++i){for(int j = 0; j < m; ++j){cin >> val[i][j];sum += val[i][j];}}vis[0][0] = 1;dfs(0, 0, val[0][0], 1);if(ans == 101){cout << 0 << endl;}else{cout << ans << endl;}return 0;}


0 0