题目大意:问能不能用不超过6张2x2的方纸在4x4的方格中摆出给定的图形?
题目分析:暴力找出,提前用数组存下每种正方形的摆放方式。然后搜索,看能否找到给定的图形。
直接上代码。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int node[9][8][2]={
{{3,2},{3,4},{1,2},{1,4},{2,1},{2,5},{3,1},{3,5}},
{{3,2+2},{3,4+2},{1,2+2},{1,4+2},{2,1+2},{2,5+2},{3,1+2},{3,5+2}},
{{3,2+2+2},{3,4+2+2},{1,2+2+2},{1,4+2+2},{2,1+2+2},{2,5+2+2},{3,1+2+2},{3,5+2+2}},
{{3+1,2},{3+1,4},{1+1,2},{1+1,4},{2+1,1},{2+1,5},{3+1,1},{3+1,5}},
{{3+1,2+1+1},{3+1,4+1+1},{1+1,2+1+1},{1+1,4+1+1},{2+1,1+1+1},{2+1,5+1+1},{3+1,1+1+1},{3+1,5+1+1}},
{{3+1,2+2+2},{3+1,4+2+2},{1+1,2+2+2},{1+1,4+2+2},{2+1,1+2+2},{2+1,5+2+2},{3+1,1+2+2},{3+1,5+2+2}},
{{3+2,2},{3+2,4},{1+2,2},{1+2,4},{2+2,1},{2+2,5},{3+2,1},{3+2,5}},
{{3+2,2+2},{3+2,4+2},{1+2,2+2},{1+2,4+2},{2+2,1+2},{2+2,5+2},{3+2,1+2},{3+2,5+2}},
{{3+2,2+1+3},{3+2,4+1+3},{1+2,2+1+3},{1+2,4+1+3},{2+2,1+1+3},{2+2,5+1+3},{3+2,1+1+3},{3+2,5+1+3}},
}; // 边
int kong[9][4][2]={
{{2,2},{2,3},{2,4},{3,3}},
{{2,3+1},{2,4+1},{2,5+1},{3,4+1}},
{{2,4+2},{2,5+2},{2,6+2},{3,5+2}},
{{2+1,2},{2+1,3},{2+1,4},{3+1,3}},
{{2+1,3+1},{2+1,4+1},{2+1,5+1},{3+1,4+1}},
{{2+1,4+2},{2+1,5+2},{2+1,6+2},{3+1,5+2}},
{{2+2,2},{2+2,3},{2+2,4},{3+2,3}},
{{2+2,3+1},{2+2,4+1},{2+2,5+1},{3+2,4+1}},
{{2+2,4+2},{2+2,5+2},{2+2,6+2},{3+2,5+2}}
};//每个正方形内部的空白
int op[25][25];
int ap[25][25];
int used[25];
int sum;
int len;
char a[25];
int flag ;
bool judge()
{
for(int i=0;i<5;i++)
for(int j=0;j<9;j++)
if(op[i][j]!=ap[i][j]) return false;
return true;
}
int w = 1;
void dfs(int x)
{
if(flag) return ;
if(judge())
{
flag=1;
return;
}
int tmp[25][25];
if(x>=6) return ;
int i,j,k;
for(int ii=0;ii<5;ii++)
for(int jj=0;jj<9;jj++)
tmp[ii][jj]=ap[ii][jj];
for(i=0;i<9;i++)
{
if(used[i]==1)continue;
used[i] = 1;
for(j=0;j<8;j++)
if(j<=3)
ap[ (node[i][j][0])-1 ][(node[i][j][1])-1] = 2;
else
ap[ (node[i][j][0])-1 ][(node[i][j][1])-1] = 1;
for(j=0;j<4;j++)
ap[(kong[i][j][0])-1][(kong[i][j][1])-1] = 0;
dfs(x+1);
used[i] = 0;
for(int ii=0;ii<5;ii++)
for(int jj=0;jj<9;jj++)
ap[ii][jj]=tmp[ii][jj];
}
return ;
}
int main()
{
int T=0;
while(gets(a)!=NULL)
{
if(a[0]=='0') break;
len = 9;
T++;
for(int i=0;i<len;i++)
{
if(a[i]==' ') op[0][i]=0;
else if(a[i]=='_')op[0][i]=2; // 2表示'_',1表示‘|’,0表示‘ ’
else op[0][i] = 1;
}
for(int i=1;i<5;i++)
{
gets(a);
for(int j=0;j<len;j++)
if(a[j]==' ') op[i][j]=0;
else if(a[j]=='_')op[i][j]=2;
else op[i][j]= 1;
}
memset(ap,0,sizeof(ap));
memset(used,0,sizeof(used));
flag = 0;
dfs(0);
printf("Case %d: ",T);
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
算是比较水的。