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 |
真不错……#ifdef TIME_CHECK #include<ctime> #endif #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int nCase,nTotalSize,nCakeNum; //The global variable is needed in dfs() function const int MAX = 41; //The maximum size of the cake is sqrt(16 * 10 * 10) = 40 bool isUsed[MAX][MAX] = {false}; //mark whether the cake has been given away struct CakePiece{ int m_nSize; bool m_bUsed; }nCakePiece[17] = {0}; //The size of each cake inline bool myCmp(CakePiece a,CakePiece b){ return a.m_nSize > b.m_nSize; } //Find the first grid not occupied void FindPosition(int& x ,int& y){ for(int i = 0;i < nTotalSize;++i){ for(int j = 0;j < nTotalSize;++j){ if(isUsed[i][j] == false){ x = i,y = j; return; } } } } bool isOkay(int num,int x,int y){ //The remaining place is not wide enough int size = nCakePiece[num].m_nSize; if(x + size > nTotalSize || y + size > nTotalSize)return false; for(int i = 0;i < size;++i){ if(isUsed[x + i][y] == true || isUsed[x][y + i] == true)return false; }return true; } //Try to cut a piece, mark all the relevant grids true void CutPiece(int num,int x,int y){ int nSize = nCakePiece[num].m_nSize; nCakePiece[num].m_bUsed = true; for(int i = x;i < x + nSize;++i){ for(int j = y;j < y + nSize;++j){ isUsed[i][j] = true; } } } //Recover a piece, mark all the relevant grids false void Recover(int num,int x,int y){ int nSize = nCakePiece[num].m_nSize; nCakePiece[num].m_bUsed = false; for(int i = x;i < x + nSize;++i){ for(int j = y;j < y + nSize;++j){ isUsed[i][j] = false; } } } //Srart stuffing, always from top-left bool dfs(int n){ //Try and stuff the nth cake piece if(n == nCakeNum)return true; int cur_x = 0,cur_y = 0; //determine where to put the cake FindPosition(cur_x,cur_y); for(int i = 0;i < nCakeNum;++i){ if(nCakePiece[i].m_bUsed == false && isOkay(i,cur_x,cur_y)){ //pruning: avoid try the same size piece if(i != 0 && nCakePiece[i-1].m_bUsed == false && nCakePiece[i].m_nSize == nCakePiece[i-1].m_nSize) continue; CutPiece(i,cur_x,cur_y); if(dfs(n+1) == true)return true; else Recover(i,cur_x,cur_y); } } return false; } int main(){ clock_t s,e; scanf("%d",&nCase); s = clock(); for(;nCase;--nCase){ scanf("%d%d",&nTotalSize,&nCakeNum); int nAreaSum = 0; for(int i = 0;i < nCakeNum;++i){ scanf("%d",&nCakePiece[i].m_nSize); nCakePiece[i].m_bUsed = false; nAreaSum += nCakePiece[i].m_nSize * nCakePiece[i].m_nSize; } if(nAreaSum != nTotalSize * nTotalSize){ printf("HUTUTU!\n");continue; } //Sort the cake in size order sort(nCakePiece,nCakePiece + nCakeNum,myCmp); //Start search, always begin from the top left; memset(isUsed,false,MAX * MAX * sizeof(bool)); if(dfs(0) == true)printf("KHOOOOB!\n"); else printf("HUTUTU!\n"); } e = clock(); printf("%d ms\n",e-s); system("PAUSE"); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator