给出一堆长度各异的木棍,这些木棍能否头尾相连形成一个正方形? 输入: 第一行包含一个整数 $N$,为数据组数。接下来 $N$ 行,每行第一个数 $M$ 代表木棍的数量,第 $2$ 至 $M + 1$ 个数为每个木棍的长度。
输出:
对每组数据,输出 `yes` 或 `no` 表示这组木棍是否能拼成正方形。
样例输入 ``` 3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5 ``` 样例输出 ``` yes no yes ```
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 25; int side; int m; int sticks[MAXN]; bool visit[MAXN]; bool DFS(int sum, int number, int position) { if(___(1)___){ return true; } int sample = 0; for (int i = position; i < m; ++i) { if (visit[i] || sum + sticks[i] > side || ___(2)___ ) { continue; } visit[i] = true; if (___(3)___) { if (DFS(0, number + 1, 0)) { return true; } else { sample = sticks[i]; } } else { if (DFS(sum + sticks[i], number, i + 1)) { return true; } else { sample = sticks[i]; } } visit[i] = false; } return false; } bool compares(int x,int y) { return x > y; } int main() { int n; scanf("%d", &n); while (n--) { int length = 0 scanf("%d", & m); for(int i = 0; i < m; i++){ scanf ("%d", &sticks[i]); length += sticks[i] ; } memset(visit, false, sizeof(visit)); if(length % 4 != 0){ printf("no\n"); continue; } side = length / 4; sort(sticks, sticks + m, Compare); if(___(4)___){ printf("no\n"); continue; } if(___(5)___){ printf("yes\n"); } else { printf("no\n"); } } return 0; }
1. (1) 处应填()。
2. (2) 处应填()。
3. (3)处应填()。
4. (4) 处应填()。
5. (5) 处应填()。
陈伦制作 版权所无 粤ICP备16127491号-1