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 ...
随机推荐
- 【Java每日一题】20170117
20170116问题解析请点击今日问题下方的“[Java每日一题]20170117”查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; import jav ...
- Laravel条件查询数据单条数据first,多条数据get
使用DB查询,必须use Illuminate\Support\Facades\DB; 多数组条件查询单条数据 first() //提交加入我们数据 public function ajax_join ...
- ASPxGridView 用法
一.ASPxGridView属性:概述设置(Settings) 1.1.Settings <Settings GridLines="Vertical" : 网格样式 Vert ...
- ajaxJson(常用)
function ajaxJson(method, url, data, callback) { var options = { type: method, url: url, dataType: ' ...
- Linux禁止ping以及开启ping的方法
---恢复内容开始--- Linux默认是允许Ping响应的,系统是否允许Ping由2个因素决定的:A.内核参数,B.防火墙,需要2个因素同时允许才能允许Ping,2个因素有任意一个禁Ping就无法P ...
- cf438E. The Child and Binary Tree(生成函数 多项式开根 多项式求逆)
题意 链接 Sol 生成函数博大精深Orz 我们设\(f(i)\)表示权值为\(i\)的二叉树数量,转移的时候可以枚举一下根节点 \(f(n) = \sum_{w \in C_1 \dots C_n} ...
- MySQL 在Windows平台上的安装及实例多开
MySQL在Windows平台上的安装及实例多开 by:授客 QQ:1033553122 测试环境 Win7 64 mysql-5.7.20-winx64.zip 下载地址: https://cd ...
- loadrunner 脚本优化-检查点设置
脚本优化-检查点设置 by:授客 QQ:1033553122 VuGen判断脚本是否执行成功是根据服务器返回的状态来确定的,如果服务器返回的是HTTP状态为200 OK,那么VuGen就认为脚本正确地 ...
- Android EditText手机号格式化输入XXX-XXXX-XXXX
先来效果图: 设置手机格式化操作只需要设置EditText的addTextChangedListener的监听,下面看代码 /*editText输入监听*/ et_activity_up_login_ ...
- tkinter之grid布局管理器详解
在很久之前,我发过一篇<tkinter模块常用参数>,里面已经几乎涵盖了tkinter的大部分教程. 好吧,其实也就是上一篇而已啦. 所谓布局,就是指控制窗体容器中各个控件(组件)的位置关 ...