Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
改进版,应该还有优化的空间In Reply To:我的做法^_^ 140ms能过,还可以优化,哪位大哥帮忙优化一下 Posted by:fxzy at 2006-02-14 14:01:25 #include<stdio.h> #include<string.h> #include<stdlib.h> int cake[41][41]; int size, n, piece[16], hash[16]; int ok; int cmp(const void *a, const void *b) { return (*(int*)b)-(*(int*)a); } int check(int x, int y, int s) { int i, j; for(i = x; i < s+x; i++) for(j = y; j < s+y; j++) if(cake[i][j]) return 0; return 1; } void change(int x, int y, int s, int t) { int i, j; for(i = x; i < x+s; i++) for(j = y; j < y+s; j++) cake[i][j] = t; } void DFS() { int x, y; int i, j; int pre = -1; if(ok) return ; for(x = 1; x <= size; x++) { for(y = 1; y <= size; y++) if(!cake[x][y]) break; if(y != size+1)break; } //find the first place for place if(x == size+1 && y == size+1) {ok = 1; return ;} for(i = 1; i < n; i++) { if(!hash[i]) { if(pre != piece[i] && x+piece[i]-1 <= size && y+piece[i]-1 <= size && check(x, y, piece[i])) { hash[i] = 1; change(x, y, piece[i], 1); DFS(); change(x, y, piece[i], 0); if(i != 0) hash[i] = 0; } pre = piece[i]; } } } int main() { int t; int i, j; scanf("%d", &t); while(t--) { ok = 0; memset(hash, 0, sizeof(hash)); memset(cake, 0, sizeof(cake)); scanf("%d %d", &size, &n); for(i = 0, j = 0; i < n; i++) { scanf("%d", &piece[i]); j += piece[i]*piece[i]; } if(j != size*size) { printf("HUTUTU!\n"); continue; } qsort(piece, n, sizeof(piece[0]), cmp); for(i = 0; i <= piece[0]; i++) for(j = 0; j <= piece[0]; j++) cake[i][j] = 1; DFS(); if(ok) printf("KHOOOOB!\n"); else printf("HUTUTU!\n"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator