POJ - 1084 Square Destroyer

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N = 61;
int n, idx;
int max_depth;
vector<int> square[N];
bool used[N];
void add(int r, int c, int len)
{
int d = n << 1 | 1;
vector<int> &s = square[idx];
s.clear();
for (int i = 0; i < len; i ++ )
{
s.push_back(1 + r * d + c + i);
s.push_back(1 + (r + len) * d + c + i);
s.push_back(1 + n + r * d + c + i * d);
s.push_back(1 + n + r * d + c + i * d + len);
}
idx ++ ;
}
bool check(vector<int> &s)
{
for (int i = 0; i < (int)s.size(); i ++ )
if (used[s[i]])
return false;
return true;
}
int f()
{
static bool backup[N];
memcpy(backup, used, sizeof used);
int res = 0;
for (int i = 0; i < idx; i ++ )
if (check(square[i]))
{
res ++ ;
for (int j = 0; j < (int)square[i].size(); j ++ )
used[square[i][j]] = true;
}
memcpy(used, backup, sizeof used);
return res;
}
bool dfs(int depth)
{
if (depth + f() > max_depth) return false;
for (int i = 0; i < idx; i ++ )
if (check(square[i]))
{
for (int j = 0; j < (int)square[i].size(); j ++ )
{
used[square[i][j]] = true;
if (dfs(depth + 1)) return true;
used[square[i][j]] = false;
}
return false;
}
return true;
}
int main()
{
int T;scanf("%d",&T);
while (T -- )
{
scanf("%d", &n), idx = 0;
memset(used, false, sizeof used);
for (int len = 1; len <= n; len ++ )
for (int r = 0; r + len <= n; r ++ )
for (int c = 0; c + len <= n; c ++ )
add(r, c, len);
int k;scanf("%d", &k);
while (k -- )
{
int x;scanf("%d", &x);
used[x] = true;
}
max_depth = 0;
while (!dfs(0)) max_depth ++ ;
printf("%d\n", max_depth);
}
return 0;
}