题目链接
http://poj.org/problem?id=1084
分析
用IDA*做,每次找出一个最小的正方形,枚举删去哪条边,继续搜索下去;
对于每个正方形,删去哪条边最优并不知道,但如果单次操作删去所有边,则结果一定不大于未来的正常操作次数。
以此作为估价函数,此题要处理出火柴的编号,每根火柴对应的正方形,及每个正方形对应的火柴。
AC代码
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
inline int read() {
int num = 0;
char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return num;
}
const int maxn = 10, maxm = 65;
int id[2 * maxn][2 * maxn], del[maxm], tmp0[maxm], tot, d, p0;
vector<int> stick[maxm], squ[maxm];
inline int estimate() {
int ans = 0;
memcpy(tmp0, del, sizeof(tmp0));
for (int i = 1; i <= tot; +