题意:

   总共有6个2*2的正方形,判断是否能够成所给的形状。

思路:

  一个正方形总共有9种摆放方式,对于整个地图来说摆放方式总共有2的9次方种摆放方式。然后将地图用9*5的数组表示,正方形的位置用其8个边的下标和4个中空的下标表示。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int bian[9][8]={
{1,3,9,13,18,19,21,22},
{3,5,11,15,20,21,23,24},
{5,7,13,17,22,23,25,26},
{10,12,18,22,27,28,30,31},
{12,14,20,24,29,30,32,33},
{14,16,22,26,31,32,34,35},
{19,21,27,31,36,37,39,40},
{21,23,29,33,38,39,41,42},
{23,25,31,35,40,41,43,44}};//2*2正方形的9种摆放方式的边坐标
int nei[9][4]={
10,11,12,20,
12,13,14,22,
14,15,16,24,
19,20,21,29,
21,22,23,31,
23,24,25,33,
28,29,30,38,
30,31,32,40,
32,33,34,42};//2*2正方形的9种摆放方式的中空坐标
char str[100];
int map[45],cot[10],map1[45];
int read()//读入数据
{
int h=0,cnt = 0, kk = 0;
for(int i=0;i<5;i++)
{
if(gets(str)==NULL)
return -1;
if(str[0]=='0')
return -1;
for(int j=0;j<9;j++)
{
map[kk++]=str[j] ==32?0:1;
if(str[j] != 32)
cnt++;
}
}
return cnt;
}
int count(int s)//计算总共使用了几个正方形
{
return s==0?0:count(s/2)+(s&1);
}
void stick(int p,int &cnt)//构建将第p个正方形贴上去后的地图
{
int i,j;
for(i=0;i<8;i++)
{
if(map1[bian[p][i]]==0)//第p个正方形边的位置如果没有边的话,边的数量+1
cnt++;
map1[bian[p][i]]=1;
}
for(i=0;i<4;i++)
{
if(map1[nei[p][i]]==1)//第p个正方形中空的位置如果有边的话,边的数量-1
            cnt--;
map1[nei[p][i]]=0;
}
}
int main()
{
int flag,cnt;
int i,j,k;
int h=1;
while((flag=read())&&flag!=-1)
{
//cout<<flag<<endl;
int flag1=0;
for(i=0;i<(1<<9);i++)
{
int n=count(i);
if(n>6||8*n<flag)
continue;
k=0;
for(j=0;j<9;j++)
if((i>>j)&1)
cot[k++]=j;
//cout<<k<<endl;
do
{
//cout<<1<<endl;
memset(map1,0,sizeof(map1));
cnt=0;
//cout<<n<<endl;
for(j=0;j<n;j++)
{
int p=cot[j];//cout<<1<<endl;
stick(p,cnt);
}
                if(cnt==flag)
{
int flag2=1;
for(int l=0;l<45;l++)
{
if(map[l]!=map1[l])
{
flag2=0;break;
                        }
                    }if(flag2)
flag1=1;
                }
if(flag1)
break;
}
while(next_permutation(cot,cot+k));
}
printf("Case %d: %s\n",h++, flag1? "Yes" : "No");
}
return 0;
}

UVA 12113 Overlapping Squares的更多相关文章

  1. UVA - 12113 Overlapping Squares(dfs+回溯)

    题目: 给定一个4*4的棋盘和棋盘上所呈现出来的纸张边缘,问用不超过6张2*2的纸能否摆出这样的形状. 思路: dfs纸的张数,每一张中枚举这张纸左上角这个点的位置,暴力解题就可以了. 这个题的覆盖太 ...

  2. UVA - 12113 Overlapping Squares(重叠的正方形)

    题意:给定一个4*4的棋盘和棋盘上所呈现出来的纸张边缘,问用不超过6张2*2的纸能否摆出指定的形状. 分析:2*2的纸在4*4的棋盘上总共有9种放置位置,枚举所有的放置位置即可.枚举情况总共种. #p ...

  3. 【习题 7-6 UVA - 12113】Overlapping Squares

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先预处理出来一个正方形. 然后每次枚举新加的正方形左上角的坐标就可以. 注意覆盖的规则,控制一下就可以. 然后暴力判断是否相同. 暴 ...

  4. 【UVA】201 Squares(模拟)

    题目 题目     分析 记录一下再预处理一下.     代码 #include <bits/stdc++.h> int main() { int t=0,s,n; while(scanf ...

  5. UVA-12113 Overlapping Squares (回溯+暴力)

    题目大意:问能不能用不超过6张2x2的方纸在4x4的方格中摆出给定的图形? 题目分析:暴力枚举出P(9,6)种(最坏情况)方案即可. 代码如下: # include<iostream> # ...

  6. LA 3790 Overlapping Squares DFS

    题意: 给出一个字符矩阵,问能否是不超过6个2×2的正方形组成的. 分析: 每次找一个最表面的正方形然后DFS就好了. 一个正方形被移开后,用一个特殊符号标记上,下次再匹配的时候就直接忽略这些位置. ...

  7. Detecting diabetic retinopathy in eye images

    Detecting diabetic retinopathy in eye images The past almost four months I have been competing in a  ...

  8. ACM-ICPC Dhaka Regional 2012 题解

    B: Uva: 12582 - Wedding of Sultan 给定一个字符串(仅由大写字母构成)一个字母表示一个地点,经过这个点或离开这个点都输出这个地点的字母) 问: 每一个地点经过的次数(维 ...

  9. UVa 201 Squares

    题意: 给出这样一个图,求一共有多少个大小不同或位置不同的正方形. 分析: 这种题一看就有思路,最开始的想法就是枚举正方形的位置,需要二重循环,枚举边长一重循环,判断是否为正方形又需要一重循环,复杂度 ...

随机推荐

  1. java一点东西(3)

    运算符的优先级:()优先级最高 ! ++ -- 单目运算符 * / % + - > < <= >= == != && || 赋值符号 面向对象设计步骤:1.发现 ...

  2. Android 播放gif图片

    Android的原生控件并不支持播放GIF格式的图片.我们都知道,在Android中如果想要显示一张图片,可以借助ImageView控件来完成,但是如果将一张GIF图片设置到ImageView里,它只 ...

  3. IClone地形编辑器结合T4M插件在Unity3D使用

    通过IClone编辑器打造的地形,经过T4M插件的转化后,资源占用极少,比在Unity中自己刷出来的地形再通过T4M转化的要小的的多多了,非常适合用在手机上. IClone地形编辑器下载地址: 如果对 ...

  4. Qt中一些常用的格式转换

    转自:http://blog.csdn.NET/yh_1988/article/details/7190356 用Qt经常头痛于一些格式不能通用的问题 在此记录备用 1 (20120112)QStri ...

  5. 查看mysql 服务器上的连接进程

    SHOW PROCESSLIST #展示全部的连接进程 select * from information_schema.processlist where  db='qwuliu' #可以进行筛选查 ...

  6. Struts2安装与简单部署实例

    打开http://struts.apache.org/网站,下载strut2 版本选择: Full Distribution: Struts2完整版 建议下载该项(此版包括以下4项): Example ...

  7. mysql update语句

    UPDATE ClientBankInfo SET status = 3 WHERE sn IN (SELECT sn FROM zjzc.ClientBankInfo WHERE cardNo IN ...

  8. 如何导出sqlserver中的表数据,sqlserver2008

    sqlserver数据库中的表数据,我们通常想使用一下,可是怎样获取这些数据呢? 1.选择任务->生成脚本 2.选择数据库 3.设置配置,让编写数据的脚本为true 4.保存为sql 5.完成 ...

  9. LeeCode-Remove Duplicates from Sorted List

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  10. SQLServer 2000 Driver for JDBC][SQLServer]传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确解决方法

    问题:[SQLServer 2000 Driver for JDBC][SQLServer]传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确.参数 1 (""): ...