//UVA1603SquareDestroyer
#include<cstdio>
#include<cstdlib>
#include<cstring>
const int MAXN = 5;
const int MAX = 100;
int n, s;
int maxd;
char exist[MAX];
int fullsize[MAX], size[MAX];
int contain[MAX][MAX];
inline int Match_row(int x, int y) {
return (2 * n + 1) * x + y;
}
inline int Match_col(int x, int y) {
return (2 * n + 1) * x + y + n;
}
void Init() {
int k;
scanf("%d", &k);
memset(contain, 0, sizeof(contain));
memset(exist, 1, sizeof(exist));
memset(size, 0, sizeof(size));
memset(fullsize, 0, sizeof(fullsize));
for(int i = 0; i < k; i++) {
int tmp;
scanf("%d", &tmp);
exist[tmp - 1] = 0;
}
s = 0;//s记录编号所有的正方形
for(int i = 1; i <= n; i++) {
for(int x = 0; x <= n - i; x++) {
for(int y = 0; y <= n - i; y++) {
size[s] = 0;
fullsize[s] = i * 4;
for(int j = 0; j < i; j++) {
int a = Match_row(x, y + j);
int b = Match_row(x + i, y + j);
int c = Match_col(x + j, y);
int d = Match_col(x + j, y + i);
contain[s][a] = 1;
contain[s][b] = 1;
contain[s][c] = 1;
contain[s][d] = 1;
size[s] += exist[a] + exist[b] + exist[c] + exist[d];
}
s++;
}
}
}
}
inline int Square_find() {
for(int i = 0; i < s; i++) if(size[i] == fullsize[i]) return i;
return -1;
}
bool Dfs(int d) {
int k = Square_find();
//printf("k = %d\n", k);
if(k == -1) return true;
if(d >= maxd) return false;
int full = 2 * n * (n + 1);
for(int i = 0; i < full; i++) {
if(contain[k][i]) {//找到 k 号正方形上的一根棍
// printf("k = %d, i = %d\n", k, i);
for(int j = 0; j < full; j++) //找到与k上的i同边的正方形
if(contain[j][i]) size[j]--;//相当于去掉了一个正方形(由判定是否存在正方形的方法可得)
if(Dfs(d + 1)) return true;
for(int j = 0; j < full; j++)//消除影响
if(contain[j][i]) size[j]++;
}
}
return false;
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
Init();
// printf("s = %d\n", s);
// for(int i = 0; i < s; i++) printf("%d: size : %2d\n",i, size[i]);
// printf("\n");
for(maxd = 1; ; maxd++) {
//printf("maxd = %d\n", maxd);
if(Dfs(0)) {
printf("%d\n", maxd); break;
}
}
}
return 0;
}
/*
2
2
0
3
3 12 17 23
*/
UVA1603SquareDestroyer
最新推荐文章于 2022-01-18 12:46:26 发布