题解:UVA10364 Square

· · 题解

题目

我们要判断给定的 N 根木棍是否能够围成一个正方形。

思路

bool flag;// 初始值0。 bool v[21]; void dfs(int x, int y, int z) { if (flag == 1) {// 找到了方案,即 flag 为 1,返回。 return; } if (x == 5) { flag = 1; return; } if (y == sum) {// 已构建完,开始建下一条边。 dfs(x + 1, 0, 0); } for (int i = z + 1; i <= n; i++) {

    if (v[i] == 0 && y + a[i] <= sum) {// 如果第 i 根木棍还未被使用并加入后不会超过目标长度。
        v[i] = 1;
        dfs(x, y + a[i], i);
        v[i] = 0;
    }
}

} signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> t; while (t--) { cin >> n; sum = 0; flag = 0; for (int i = 1; i <= n; i++) { cin >> a[i]; sum += a[i]; } if (sum % 4 != 0) {//总长不能能被 4 整除。 cout << "no"; } else { sum /= 4; bool f = 0; for (int i = 1; i <= n; i++) { if (a[i] > sum) { f = 1; break; } } if (f) { cout << "no"; } else { for (int i = 1; i <= n; i++) { v[i] = 0; } dfs(1, 0, 1); if (flag) {//找到了。 cout << "yes"; } else { cout << "no"; } } } cout << endl; } return 0; }