Overlapping Squares (UVA - 12113)

题目大意:问能不能用不超过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;
}
算是比较水的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值