UVA1603SquareDestroyer

来源:互联网 发布:淘宝能卖视频吗 编辑:程序博客网 时间:2024/06/16 16:27
//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;} /*22033 12 17 23*/

原创粉丝点击