UVA 12113 Overlapping Squares
题意:
总共有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的更多相关文章
- UVA - 12113 Overlapping Squares(dfs+回溯)
题目: 给定一个4*4的棋盘和棋盘上所呈现出来的纸张边缘,问用不超过6张2*2的纸能否摆出这样的形状. 思路: dfs纸的张数,每一张中枚举这张纸左上角这个点的位置,暴力解题就可以了. 这个题的覆盖太 ...
- UVA - 12113 Overlapping Squares(重叠的正方形)
题意:给定一个4*4的棋盘和棋盘上所呈现出来的纸张边缘,问用不超过6张2*2的纸能否摆出指定的形状. 分析:2*2的纸在4*4的棋盘上总共有9种放置位置,枚举所有的放置位置即可.枚举情况总共种. #p ...
- 【习题 7-6 UVA - 12113】Overlapping Squares
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先预处理出来一个正方形. 然后每次枚举新加的正方形左上角的坐标就可以. 注意覆盖的规则,控制一下就可以. 然后暴力判断是否相同. 暴 ...
- 【UVA】201 Squares(模拟)
题目 题目 分析 记录一下再预处理一下. 代码 #include <bits/stdc++.h> int main() { int t=0,s,n; while(scanf ...
- UVA-12113 Overlapping Squares (回溯+暴力)
题目大意:问能不能用不超过6张2x2的方纸在4x4的方格中摆出给定的图形? 题目分析:暴力枚举出P(9,6)种(最坏情况)方案即可. 代码如下: # include<iostream> # ...
- LA 3790 Overlapping Squares DFS
题意: 给出一个字符矩阵,问能否是不超过6个2×2的正方形组成的. 分析: 每次找一个最表面的正方形然后DFS就好了. 一个正方形被移开后,用一个特殊符号标记上,下次再匹配的时候就直接忽略这些位置. ...
- Detecting diabetic retinopathy in eye images
Detecting diabetic retinopathy in eye images The past almost four months I have been competing in a ...
- ACM-ICPC Dhaka Regional 2012 题解
B: Uva: 12582 - Wedding of Sultan 给定一个字符串(仅由大写字母构成)一个字母表示一个地点,经过这个点或离开这个点都输出这个地点的字母) 问: 每一个地点经过的次数(维 ...
- UVa 201 Squares
题意: 给出这样一个图,求一共有多少个大小不同或位置不同的正方形. 分析: 这种题一看就有思路,最开始的想法就是枚举正方形的位置,需要二重循环,枚举边长一重循环,判断是否为正方形又需要一重循环,复杂度 ...
随机推荐
- jwplayer去Logo、自定义公司信息、限制拖动
function initplayer(){ jwplayer("mediaplayer").setup({ primary: "fl ...
- tabbar加小红点
原文 http://blog.csdn.net/u013531246/article/details/44460115 #import <UIKit/UIKit.h> @interfa ...
- QQ中未读气泡拖拽消失的实现(参照一位年轻牛B的博主的思路自己实现了一下)
原文链接:http://kittenyang.com/drawablebubble/,博主年轻却很有思想.相仿的年纪,很佩服他! 首先分析拖拽时的图,大圆.不规则的图(实际上时有规律的不然也画不出来, ...
- Python3.5入门学习记录-列表、元组、字典
1.列表 python列表的定义使用[] list = [1,2,3,4,5] #创建一个心列表list 获取列表中的值 first = list[0] #list中第一个值 last = list[ ...
- x^2+y^2=N的整数解?
本文系转载:http://blog.sina.com.cn/s/blog_a661ecd50101cv41.html 我们先研究这个问题的一部分:哪些素数是两平方数之和?为什么我们先研究素数,有个很重 ...
- block中无法使用C数组变量
在Objective-C的block中无法使用C数组,即使我们不对C数组做任何改变,编译的时候也会报错: #include <stdio.h> int main() { const cha ...
- C#解析JSON数据
本篇文章主要介绍C#对Json数据的读取. 主要操作过程是: 发送Http请求获取Json数据 把获取的Json数据转换成C#中的类 下面我们以12306火车票余票的数据为例进行切入. 首先来看一下h ...
- 如何使用Assetic进行文件管理
安装和配置Assetic 从symfony2.8开始,Assetic就不再被包括在symfony标准版.使用任何Assetic的特性之前需要安装AsseticBundel,在命令行执行下面命令: $ ...
- js编程风格
1.缩进层级,建议四个空格. 2.语句结尾使用分号. 3.行的长度不超过80个字符. 4.换行建议加两个缩进,即8个空格. 5.合理的利用空行. 6.命名: 6.1 变量,驼峰式大小写,有小写字母开始 ...
- 序列化与反序列化 - BinaryFormatter二进制(.dat)、SoapFormatter(.soap)、XmlSerializer(.xml)
序列化的作用是什么?为什么要序列化? 1.在进程下次启动时读取上次保存的对象的信息. 2.在不同的应用程序域或进程之间传递数据. 3.在分布式应用程序中的各应用程序之间传输对象. 所为序列化,就是将对 ...