Problem UVA11846-Finding Seats Again

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 3
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)的更多相关文章

  1. hdu1937 Finding Seats

    hdu1937 Finding Seats 题意是 求最小的矩形覆盖面积内包含 k 个 空位置 枚举上下边界然后 双端队列 求 最小面积 #include <iostream> #incl ...

  2. HDU 1937 F - Finding Seats 枚举

    F - Finding Seats Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  3. UVa 11846 - Finding Seats Again

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. hdu 1937 Finding Seats

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  5. HDU 4414 Finding crosses(dfs)

    Problem Description The Nazca Lines are a series of ancient geoglyphs located in the Nazca Desert in ...

  6. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  7. Soj题目分类

    -----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...

  8. 转载:hdu 题目分类 (侵删)

    转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...

  9. poj 3740 Easy Finding 二进制压缩枚举dfs 与 DLX模板详细解析

    题目链接:http://poj.org/problem?id=3740 题意: 是否从0,1矩阵中选出若干行,使得新的矩阵每一列有且仅有一个1? 原矩阵N*M $ 1<= N <= 16 ...

随机推荐

  1. 【Mybatis】MyBatis调用带有返回结果、output参数的存储过程上与ibatis的区别

    用过mybatis的应该都知道它是ibatis被Google收购后重新命名的一个工程,因此也做了大量升级.本文就来介绍下两者在调用存储过程上的一点区别,ibatis有一个专门的标签<proced ...

  2. (8)Microsoft office Word 2013版本操作入门_制作传单海报

    1.纸张大小,方向设定. 1.1纸张大小: [页面布局]----[纸张大小] 可以选择已有的尺寸,也可以选择其他自定义的大小. 1.2 方向设定: [页面布局]--[纸张方向]选择 横向或者纵向 2. ...

  3. SSM+Netty项目结合思路

    最近正忙于搬家,面试,整理团队开发计划等工作,所以没有什么时间登陆个人公众号,今天上线看到有粉丝想了解下Netty结合通用SSM框架的案例,由于公众号时间限制,我不能和此粉丝单独沟通,再此写一篇手记分 ...

  4. linux 中的单引号 和双引号有什么区别吗

    单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符 ,而不会有特殊符号.我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个 ...

  5. eclipse提交到git

    前言 今天是我正式加入GitHub的第一天,作为世界上最大的同性交友社区,以push和pull出名的它,让我坠入其中并无法自拔,废话不多说,上教程: 步骤一 首先,你需要注册一个github账号,相信 ...

  6. mysql zip安装

    管理员运行cmd,进入bin目录1.在my.ini(mysql解压目录下)文件中复制下面内容 [client] port = 3306 [mysql] default-character-set=ut ...

  7. win10怎么录制电脑屏幕 电脑播放视频录制

    随着社会的发展,网络信息化时代已经来临,作为一个上班族,每天都离不开电脑,电脑仿佛就是我们的合作伙伴,也是陪伴我们的朋友,如今win10系统已经出来了,关于win10系统的问题相信大家有很多的问题,今 ...

  8. iOS----------关于UDID和UUID的一些理解

    一.UDID(Unique Device Identifier)  UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识. 在很多需要限制一台设备一个账号的应用中经 ...

  9. HashMap 与 ConcrrentHashMap 使用以及源码原理分析

    前奏一:HashMap面试中常见问题汇总 HashMap的工作原理是近年来常见的Java面试题,几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和Has ...

  10. verilog实现红黄蓝三秒灯

    代码如下 test.v文件 led.v文件 module test(); wire led_r,led_g,led_b; ; clk <= ~clk; led c1 ( .clk(clk), . ...