UVA - 12113 Overlapping Squares(dfs+回溯)
阿新 • • 發佈:2019-02-21
容易 ans pair ets ems clu turn esp con
題目:
給定一個4*4的棋盤和棋盤上所呈現出來的紙張邊緣,問用不超過6張2*2的紙能否擺出這樣的形狀。
思路:
dfs紙的張數,每一張中枚舉這張紙左上角這個點的位置,暴力解題就可以了。
這個題的覆蓋太惡心了,很容易搞混~~~(因為搞混一直TLE+WA…………)
代碼:
#include <bits/stdc++.h> #define inf 0x3f3f3f3f #define MAX 1000000000 #define mod 1000000007 #define FRE() freopen("in.txt","r",stdin) #define FRO() freopen("out.txt","w",stdout) usingnamespace std; typedef long long ll; typedef pair<int,int> P;//first-距離 second-編號 const int maxn = 8; int ans[6][10],mp[5][10]; char str[5][10]; bool judge(){ for(int r=0; r<5; r++){ for(int c=0; c<9; c++){ if(ans[r][c]!=mp[r][c]){ return false; } } }return true; } void copyArray(int a[5][10],int b[5][10]){ for(int i=0; i<5; i++){ for(int j=0; j<9; j++){ a[i][j] = b[i][j]; } } } void putPapper(int x,int y){//-95 |124 mp[x][y+1]=mp[x][y+3]=2; mp[x+2][y+1]=mp[x+2][y+3]=2; //mp[x][y]=mp[x][y+2]=mp[x][y+4]=32;mp[x+2][y+2]=0; mp[x+1][y+1]=mp[x+1][y+2]=mp[x+1][y+3]=0; mp[x+1][y]=mp[x+1][y+4]=1; mp[x+2][y]=mp[x+2][y+4]=1; } bool dfs(int deep){ if(deep>6) return false; for(int i=0; i<3; i++){ for(int j=0; j<=4; j+=2){ int temp[5][10]; copyArray(temp,mp); putPapper(i,j); if(judge())return true; if(dfs(deep+1))return true; copyArray(mp,temp); } } return false; } void check(){ for(int i=0; i<5; i++){ for(int j=0; j<9; j++){ printf("%3d",ans[i][j]); } printf("\n"); } printf("\n\n\n\n"); } int main(){ //FRE(); int kase = 0; while(gets(str[0])&&str[0][0]!=‘0‘){ memset(mp,0,sizeof(mp)); memset(ans,0,sizeof(ans)); for(int i=1; i<5; i++){ gets(str[i]); } for(int i=0; i<5; i++){ for(int j=0; j<9; j++){ if(str[i][j]==‘_‘) ans[i][j]=2; else if(str[i][j]==‘|‘) ans[i][j]=1; } } //check(); if(dfs(1)){ printf("Case %d: Yes\n",++kase); }else{ printf("Case %d: No\n",++kase); } } return 0; }
UVA - 12113 Overlapping Squares(dfs+回溯)