UVA11846-Finding Seats Again(DFS)
Accept: 69 Submit: 433
Time Limit: 10000 mSec
Problem Description
A set of n2 computer scientists went to the movies. Fortunately, the theater they chose has a square layout: n rows, each one with n seats. However, these scientists are not all from the same research area and they want to seat together. Indeed, there are K independent research groups of scientists among them (no scientist belongs to two of them) with a distiguished leader for each group. Then the leader bought the tickets for his whole group, and he did it in such a way that all his group could seat occupying a rectangular set of seats (and everyone in this set of seats belongs to the same group). Every group was placed satisfying this bizarre condition, although the scientists did not care where the actual assigned areas were. The usher was informed of the situation and he decided to annotate in a theater map a satisfactory seats deploying. He thought that if he wrote the position of each group’s leader in the map indicating besides the corresponding group size, he could tell where to accomodate every scientist. But he discovered that it is not so easy! The usher asks for your help. You must tell him a way to place the K rectangular areas with the given sizes, and with the corresponding leader for each group seated where it was originally assigned.
Input
Input consists of several test cases, each one defined by a set of lines:
• the first line in the case contains two numbers n and K separated by blanks, with n representing the size of the theater (0 < n < 20) and K the number of groups (K ≤ 26);
• the next n lines describe the usher’s map. A one-digit decimal number in the map indicates the seat of a leader and the size of his group. A point indicates that no leader will sit there.
The end of the input is indicated by the line
0 0
Output
For each test case, display an answer consisting in n lines each one of them with n characters representing a seat occupation for the theater. Each group is assigned to an uppercase letter and all of its members are identified with that letter. No two groups are assigned to the same letter.
Sample Input
3.4
...
.2.
7 18
...4.2.
...45..
222..3.
...2..3
.24...2
...2.3.
22..3..
0 0
Sample Output
ABB
ABB
ACC
AAAABCC
DDDDBEF
GHIIBEF
GHJKBEF
LLJKBMM
NOJPQQQ
NOJPRRR
题解:这个题还是挺有价值的,看到这个题目,第一时间想到了UVA211的那个多米诺效应那个题,但是这两个题除了题意有点相似之外感觉就没啥相同的了(虽然都是DFS),一开始的思路围绕是数字的格子展开,这个思路在填字母的时候就有很大的困难,这个是数字的格子位于这个矩形的哪里,这个矩形的长宽分别是多少,这两个问题使得这个思路几乎就行不通了。最后参考了大佬的题解(orz),发现他不是从是数字的格子开始扩展,而是直接顺着从没有填过字母的格子开始扩展,扩展的范围很清楚,就是先枚举行,再枚举列,对于枚举中一个给定的矩形,首先这里不能有字母,其次有且仅有一个数字,并且数字的大小等于矩形的面积,满足了这些,就是一个可以继续深层递归的状态,接着dfs下去。这里在枚举的过程中有一个不错的减少枚举的方法,就是如果先枚举行,那么列的最大值随着行的增加一定是不增的(原因很简单,详见代码),这样就可以随时改变列的最大值从而减少枚举。
#include <bits/stdc++.h> using namespace std; const int maxn = ;
const int INF = 0x3f3f3f3f; int n, k;
char gra[maxn][maxn], ans[maxn][maxn]; bool dfs(int id, char ch) {
while (ans[id / n][id % n] != '.') id++;
if (id == n * n) return true; int sr = id / n, sc = id % n, ec = n;
for (int r = sr; r < n; r++) {
for (int c = sc; c < ec; c++) {
if (ans[r][c] != '.') { ec = c; break; }
int sum = (r - sr + )*(c - sc + );
int num = INF;
bool ok = true;
for (int i = sr; i <= r; i++) {
for (int j = sc; j <= c; j++) {
if (isdigit(gra[i][j])) {
if (num != INF) { ok = false; break; }
else num = gra[i][j] - '';
}
}
if (!ok) break;
}
if (!ok || sum > num) { ec = c; break; }
if (sum < num) continue; for (int i = sr; i <= r; i++) {
for (int j = sc; j <= c; j++) {
ans[i][j] = ch;
}
}
if (dfs(id + c - sc + , ch + )) return true;
for (int i = sr; i <= r; i++) {
for (int j = sc; j <= c; j++) {
ans[i][j] = '.';
}
}
}
}
return false;
} int main()
{
//freopen("input.txt", "r", stdin);
while (~scanf("%d%d", &n, &k) && (n || k)) {
for (int i = ; i < maxn; i++) {
for (int j = ; j < maxn; j++) {
ans[i][j] = '.';
}
}
for (int i = ; i < n; i++) {
scanf("%s", gra[i]);
} dfs(, 'A'); for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
printf("%c", ans[i][j]);
}
printf("\n");
}
}
return ;
}
UVA11846-Finding Seats Again(DFS)的更多相关文章
- hdu1937 Finding Seats
hdu1937 Finding Seats 题意是 求最小的矩形覆盖面积内包含 k 个 空位置 枚举上下边界然后 双端队列 求 最小面积 #include <iostream> #incl ...
- HDU 1937 F - Finding Seats 枚举
F - Finding Seats Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- UVa 11846 - Finding Seats Again
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- hdu 1937 Finding Seats
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- HDU 4414 Finding crosses(dfs)
Problem Description The Nazca Lines are a series of ancient geoglyphs located in the Nazca Desert in ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- Soj题目分类
-----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- poj 3740 Easy Finding 二进制压缩枚举dfs 与 DLX模板详细解析
题目链接:http://poj.org/problem?id=3740 题意: 是否从0,1矩阵中选出若干行,使得新的矩阵每一列有且仅有一个1? 原矩阵N*M $ 1<= N <= 16 ...
随机推荐
- 1. 七种join的sql编写
一.join图 二.sql演示 a.创建演示表及数据 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ----------------------- ...
- C#设计模式之十一享元模式(Flyweight Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第六个模式,该模式是[享元模式],英文名称是:Flyweight Pattern.还是老套路,先从名字上来看看.“享元”是不是可以这样理解,共享“单元”,单元 ...
- C#设计模式之十二代理模式(Proxy Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...
- javascript算法-单链表
链表相比数组更具灵活性和扩展性.主要有节点数据以及指向节点的指针所构成. 链表中节点的实现[元素和指针]: let Node = function( element ){ this.element = ...
- 10;XHTML 其他标记
1.自动展示网页内容 2.如何让别人找到你的网页 3.活动文字:<marquee>…</marquee> 4.在网页中加入脚本程序 10.1 10.1 10.1 10.1 自动 ...
- 1:Python开发:初识Python
1.开发语言: 高级语言:Python, Java, PHP ,C# ,Go, ruby, c++ ==>字节码 低级语言:C,汇编 ==>机器码 2.开发语言的对比: PHP类:适用于写 ...
- Nginx 配置下载附件让浏览器提示用户是否保存
Nginx配置下载附件让浏览器提示用户是否保存 by:授客 QQ:1033553122 测试环境 nginx-1.10.0 问题描述: 前端页面,IE11浏览器下请求下载附件模板,针对xls ...
- 浅谈Android 混淆和加固
混淆: 针对项目代码,代码混淆通常将代码中的各种元素(变量.函数.类名等)改为无意义的名字,使得阅读的人无法通过名称猜测其用途,增大反编译者的理解难度. 虽然代码混淆可以提高反编译的门槛,但是对开发者 ...
- Android为TV端助力 转载弩的博客
Android.mk简介:Android.mk文件用来告知NDK Build 系统关于Source的信息. Android.mk将是GNU Makefile的一部分,且将被Build System解析 ...
- day15(PYTHON)推导式{生成器,字典,列表,集合}
#[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理 #[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能 # ...