原题链接:https://vjudge.net/problem/UVA-12113
分类:暴力枚举
备注:模拟,简单
本来是简单题的,但是开始想复杂去试着填充色,后面直接模拟又debug好久… 被自己的愚蠢破防了😭
每次共9种选择,9^6=531441,直接暴力枚举显然是可行的。
#include<bits/stdc++.h>
using namespace std;
char read(){
char ch=getchar();
while(ch=='\n')ch=getchar();
return ch;
}
char g[5][10],t[5][10];
bool check(){
for(int i=0;i<5;i++)
for(int j=0;j<9;j++)
if(t[i][j]!=g[i][j])return false;
return true;
}
bool ida(int now,int maxd){
if(now==maxd)
if(check())return true;
else return false;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
char tmp[3][5];
for(int k1=0;k1<3;k1++)
for(int k2=0;k2<5;k2++){
int x=i-1+k1,y=2*(j-1)+k2;
tmp[k1][k2]=t[x][y];
}
t[i-1][2*j-1]=t[i-1][2*j+1]='_';
t[i+1][2*j-1]=t[i+1][2*j+1]='_';
t[i][2*j-2]=t[i+1][2*j-2]='|';
t[i][2*j+2]=t[i+1][2*j+2]='|';
t[i][2*j-1]=t[i][2*j+1]=' ';
t[i][2*j]=t[i+1][2*j]=' ';
if(ida(now+1,maxd))return true;
for(int k1=0;k1<3;k1++)
for(int k2=0;k2<5;k2++){
int x=i-1+k1,y=2*(j-1)+k2;
t[x][y]=tmp[k1][k2];
}
}
}
return false;
}
int main(void){
//freopen("in.txt","r",stdin);
int kase=0;
while(1){
memset(g,' ',sizeof(g));
memset(t,' ',sizeof(t));
g[0][0]=read();
if(g[0][0]=='0')break;
for(int j=1;j<10;j++)g[0][j]=read();
for(int i=1;i<5;i++)for(int j=0;j<10;j++)g[i][j]=read();
printf("Case %d: ",++kase);
int num=0;
while(num<=6)if(ida(0,num))break;
else num++;
if(num<=6)printf("Yes\n");
else printf("No\n");
}
return 0;
}