UVA-12113 Overlapping Squares (回溯+暴力)
题目大意:问能不能用不超过6张2x2的方纸在4x4的方格中摆出给定的图形?
题目分析:暴力枚举出P(9,6)种(最坏情况)方案即可。
代码如下:
# include<iostream> # include<cstdio> # include<cstring> # include<algorithm> using namespace std; int vis[10]; char mp[8][15],p1[8][15]; bool judge() { for(int i=0;i<5;++i) for(int j=0;j<9;++j) if(mp[i][j]!=p1[i][j]) return false; return true; } bool dfs(int step) { if(judge()) return true; if(step>=6) return false; char p2[6][10]; for(int i=0;i<5;++i) for(int j=0;j<9;++j) p2[i][j]=p1[i][j]; for(int i=0;i<9;++i){ if(vis[i]) continue; vis[i]=1; int r=i/3,c=2*(i%3)+1; p1[r][c]=p1[r][c+2]=p1[r+2][c]=p1[r+2][c+2]='_'; p1[r+1][c-1]=p1[r+2][c-1]=p1[r+1][c+3]=p1[r+2][c+3]='|'; p1[r+1][c]=p1[r+1][c+1]=p1[r+1][c+2]=p1[r+2][c+1]=' '; if(dfs(step+1)) return true; vis[i]=0; for(int i=0;i<5;++i) for(int j=0;j<9;++j) p1[i][j]=p2[i][j]; } return false; } int main() { int cas=0; while(1) { for(int i=0;i<5;++i){ gets(mp[i]); if(mp[i][0]=='0') return 0; } printf("Case %d: ",++cas); for(int i=0;i<5;++i) for(int j=0;j<9;++j) p1[i][j]=' '; memset(vis,0,sizeof(vis)); if(dfs(0)) printf("Yes\n"); else printf("No\n"); } return 0; }