标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 16579 | Accepted: 5403 |
Description
Input
Output
Sample Input
2 4 8 1 1 1 1 1 3 1 1 5 6 3 3 2 1 1 1
Sample Output
KHOOOOB! HUTUTU!
题意:用小正方形去铺大正方形,问是否能恰好铺满。
思路:见代码。
#include <iostream> #include <string.h> using namespace std; const int MAXN=165; int side,n; int l[MAXN]; int col[MAXN]; bool dfs(int dep) { if(dep==n) return true; int mn=165; int mnc; for(int i=1;i<=side;i++)//从最左和最上面开始填 { if(col[i]<mn) { mn=col[i]; mnc=i; } } for(int size=10;size>=1;size--)//先填大的 { if(!l[size]) continue; if(col[mnc]+size<=side&&mnc+size-1<=side)//检查行与列是否越界 { int wide=0; for(int i=mnc;i<=mnc+size-1;i++)//检查两端所夹的宽度buf { if(col[i]==col[mnc]) { wide++; } else break; } if(wide>=size)//buf可以放下当前的小正方形 { l[size]--; for(int i=mnc;i<=mnc+size-1;i++) { col[i]+=size; } if(dfs(dep+1)) { return true; } //回溯 l[size]++; for(int i=mnc;i<=mnc+size-1;i++) { col[i]-=size; } } } } return false; } int main() { int T; cin>>T; while(T--) { memset(col,0,sizeof(col)); memset(l,0,sizeof(l)); cin>>side>>n; int sum=0; for(int i=0;i<n;i++) { int x; cin>>x; l[x]++; sum+=(x*x); } if(side*side!=sum) { cout<<"HUTUTU!"<<endl; } else { if(dfs(0)) { cout<<"KHOOOOB!"<<endl; } else { cout<<"HUTUTU!"<<endl; } } } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/5692220.html