uva387 - A Puzzling Problem
The goal of this problem is to write a program which will take from 1 to 5 puzzle pieces such as those shown below and arrange them, if possible, to form a square. An example set of pieces is shown here.

The pieces cannot be rotated or flipped from their original orientation in an attempt to form a square from the set. All of the pieces must be used to form the square. There may be more than one possible solution for a set of pieces, and not every arrangement will work even with a set for which a solution can be found. Examples using the above set of pieces are shown here.

Input
The input file for this program contains several puzzles (i.e. sets of puzzle pieces) to be solved. The first line of the file is the number of pieces in the first puzzle. Each piece is then specified by listing a single line with two integers, the number of rows and columns in the piece, followed by one or more lines which specify the shape of the piece. The shape specification consists of `0' and `1' characters, with the `1' characters indicating the solid shape of the puzzle (the `0' characters are merely placeholders). For example, piece `A' above would be specified as follows:
2 3
111
101
The pieces should be numbered by the order they are encountered in the puzzle. That is, the first piece in a puzzle is piece #1, the next is piece #2, etc. All pieces may be assumed to be valid and no larger than 4 rows by 4 columns.
The line following the final line of the last piece contains the number of pieces in the next puzzle, again followed by the puzzle pieces and so on. The end of the input file is indicated by a zero in place of the number of puzzle pieces.
Output
Your program should report a solution, if one is possible, in the format shown by the examples below. A 4-row by 4-column square should be created, with each piece occupying its location in the solution. The solid portions of piece #1 should be replaced with `1' characters, of piece #2 with `2' characters, etc. The solutions for each puzzle should be separated by a single blank line.
If there are multiple solutions, any of them is acceptable. For puzzles which have no possible solution simply report ``No solution possible''.
Sample Input
4
2 3
111
101
4 2
01
01
11
01
2 1
1
1
3 2
10
10
11
4
1 4
1111
1 4
1111
1 4
1111
2 3
111
001
5
2 2
11
11
2 3
111
100
3 2
11
01
01
1 3
111
1 1
1
0
Sample Output
1112
1412
3422
3442 No solution possible 1133
1153
2223
2444
// 题意:用n个积木块拼出一个4*4的正方形,要求每个块恰好用一次,不能旋转或者翻转。求任意一个方案
// 算法:本题写法有很多,由于规模非常小,这里给出一个效率不算高但较好实现的方法:每层搜索选一个可用积木,再枚举一个位置放上去
一个一个放即可。
Piece封装之后,代码更清晰。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=5;
int board[maxn][maxn];
int n;
struct Piece {
int r, c, size;
char data[maxn][maxn];
void read() {
scanf("%d%d", &r, &c);
for(int i=0;i<r;i++)
{
scanf("%s", data[i]);
for(int j=0;j<c;j++)
size+=data[i][j]-'0';
}
}
bool can_place(int x, int y) {
if(x+r>4 || y+c>4) return false;
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
if(data[i][j]=='1' && board[x+i][y+j]!=0)
return false;
return true;
} void fill(int x, int y, int v) {
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
if(data[i][j]=='1')
board[x+i][y+j]=v;
}
}pieces[5]; bool dfs(int d, int cnt)
{
if(d==n)
{
return cnt==16;
} for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
if(pieces[d].can_place(i, j))
{
pieces[d].fill(i, j, d+1);
if(dfs(d+1, cnt+pieces[d].size)) return true;
pieces[d].fill(i, j, 0);
} }
return false;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("./uva387.in", "r", stdin);
#endif
int kase=0;
while(scanf("%d", &n)==1 && n) {
kase++;
if(kase!=1)
printf("\n");
memset(pieces, 0, sizeof(pieces));
memset(board, 0, sizeof(board));
int total=0;
for(int i=0;i<n;i++)
{
pieces[i].read();
total+=pieces[i].size;
}
if(total==16 && dfs(0, 0))
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
printf("%d", board[i][j]);
printf("\n");
}
}
else
printf("No solution possible\n"); }
return 0;
}
uva387 - A Puzzling Problem的更多相关文章
- uva 387 A Puzzling Problem (回溯)
A Puzzling Problem The goal of this problem is to write a program which will take from 1 to 5 puzz ...
- UVA - 387 A Puzzling Problem
题目链接: https://vjudge.net/problem/UVA-387 思路: 非常有意思的拼图,深搜+回溯, 输出硬伤:除了第一次之外,每次先输空格,再输出结果, 以及可能给的数据拼不成4 ...
- [DLX精确覆盖] hdu 1603 A Puzzling Problem
题意: 给你n块碎片,这些碎片不能旋转.翻折. 问你能不能用当中的某些块拼出4*4的正方形. 思路: 精确覆盖裸题了 建图就是看看每一个碎片在4*4中能放哪些位置,这个就作为行. 列就是4*4=16个 ...
- UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...
- 【转】Dancing Links题集
转自:http://blog.csdn.net/shahdza/article/details/7986037 POJ3740 Easy Finding [精确覆盖基础题]HUST1017 Exact ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- hdu图论题目分类
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- dancing links 题集转自夏天的风
POJ3740 Easy Finding [精确覆盖基础题] HUST1017 Exact cover [精确覆盖基础] HDOJ3663 Power Stations [精确覆盖] Z ...
随机推荐
- 自定义View(二)--继承自ViewGroup
自定义View包括很多种,上一次随笔中的那一种是完全继承自View,这次写的这个小Demo是继承自ViewGroup的,主要是将自定义View继承自ViewGroup的这个流程来梳理一下,这次的Dem ...
- [搜片神器]直接从DHT网络下载BT种子的方法
DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO 数据处理程序开源地址:https://github.com/h31h31/H31DHTMgr DHT系 ...
- MySQL修改root密码的几种方法
方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:my ...
- 性能测试之LoardRunner 测试场景监控关注的几点
1.系统业务处理能力,即通常我们在进行性能测试的时候,在特定的硬件和软件环境下考察的业务处理能力,即“事物”,需要关注当前.平时.峰值以及长远未来业务发展情况,考虑不同业务的处理数量,从而设定相应的业 ...
- U盘安装CentOS无法进入Centos系统解决办法
转自:http://blog.sina.com.cn/s/blog_3feedf320101idlu.html 目前使用U盘安装系统逐渐因为它的便捷而受到人们的欢迎,但是使用U盘来安装Cent ...
- 判断CString字符串中各位是数字,大小写字母,符号,汉字.xml
pre{ line-height:1; color:#1e1e1e; background-color:#e9e9ff; font-size:16px;}.sysFunc{color:#627cf6; ...
- java --- 设计模式 --- 动态代理
Java设计模式——动态代理 java提供了动态代理的对象,本文主要探究它的实现, 动态代理是AOP(面向切面编程, Aspect Oriented Programming)的基础实现方式, 动态代理 ...
- Python状况:为什么PyPy是Python的未来?
Python 现在已经不仅仅是胶水脚本语言了. 不信?看看下面使用Python的成功案例: YouTube - 主要由 Python编写 NASA Industrial Light & Mag ...
- ps教程-三分钟画齿轮
- linux中hosts文件的修改
转载自http://hi.baidu.com/dillisbest/item/5e0b612d011b4cd40e37f9a6 1. 关于/etc/host,主机名和IP配置文件 Hosts - Th ...