UVa 11846 - Finding Seats Again
链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2946
题意:
有一个 n*n(n<20)的座位矩阵里坐着k(k≤26)个研究小组。
每个小组的座位都是矩形形状。输入每个小组组长的位置和该组的成员个数,找到一种可能的座位方案。
分析:
深搜 + 剪枝,以矩形为搜索对象,每一层选择一个尚未放置字母的位置,作为矩形的左上角,向行和列依次扩展。
如果选择的矩形中只有一个小组,且其面积等于小组的成员个数,则在这个矩形内放置字母,然后递归下一层。
矩形的面积应不超过 9,在向列扩展的过程中可以对列的范围进行剪枝,具体见代码。
代码:
#include <cstdio>
#include <cstring> int n, k;
char seat[][], ans[][]; 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 + );
if(sum > ) { ec = c; break; }
int digit = ;
bool valid = true;
for(int t = sr; t <= r; t++){
for(int i = sc; i <= c; i++){
if(seat[t][i] != '.'){
if(digit != ){ valid = false; break; }
digit = seat[t][i] - '';
}
}
if(!valid) break;
}
if(!valid) { ec = c; break; }
if(digit < sum) { ec = c; break; }
if(digit > sum) continue;
for(int t = sr; t <= r; t++){
for(int i = sc; i <= c; i++) ans[t][i] = ch;
}
if(dfs(id + c - sc + , ch + )) return true;
for(int t = sr; t <= r; t++){
for(int i = sc; i <= c; i++) ans[t][i] = '.';
}
}
}
return false;
} int main(){
while(scanf("%d%d", &n, &k) && n){
memset(ans, '.', sizeof(ans));
for(int r = ; r < n; r++) scanf("%s", seat[r]);
dfs(, 'A');
for(int r = ; r < n; r++){
for(int c = ; c < n; c++) printf("%c", ans[r][c]);
printf("\n");
}
}
return ;
}
总结:
搜索对象的选取很重要,若选取不当,则会运行超时。
UVa 11846 - Finding Seats Again的更多相关文章
- 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 ...
- hdu 1937 Finding Seats
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- Soj题目分类
-----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- UVA 1456 六 Cellular Network
Cellular Network Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit S ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- uva 315 Network(无向图求割点)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- SpringMVC教程3
SpringMVC教程2 一.文件上传 1.引入相关jar包 maven坐标 <!-- fileUpload 解析上传的文件用到的jar --> <dependency> &l ...
- FFmpeg内存IO模式(内存区作输入或输出)
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10318145.html 所谓内存IO,在FFmpeg中叫作"buffered ...
- 史上最全的 Python 3 类型转换指南
int 支持转换为 int 类型的,仅有 float.str.bytes,其他类型均不支持. float -> int 会去掉小数点及后面的数值,仅保留整数部分. int(-12.94) # - ...
- nopCommerce 3.2新功能
NopCommerce版本3.20,上周被释放,对于那些你谁还不熟悉新版本或刚经过脱脂发行说明我们的新功能的详细介绍. 在nopCommerce 3.20新功能的工作往往需要某些设置或语言资源的快速修 ...
- asp.net mvc 模型验证组件——FluentValidation
asp.net mvc 模型验证组件——FluentValidation 示例 using FluentValidation; public class CustomerValidator: Abst ...
- 无法初始化 PowerShell 主机解决方案
Question无法初始化 PowerShell 主机.如果您的 PowerShell 执行策略设置设为 AllSigned,请先打开程序包管理器控制台以初始化该主机. --------------- ...
- 服务器CPU居高不下--解决问题历程
基本的概述 在一个服务器的集群上面,服务器的CPU长时间居高不下,响应的时间也一直很慢,即使扩容了服务器CPU的下降效果也不是很明显. 对于CPU过高的原因,可以总结到以下原因: 太多的循环或者死循环 ...
- Python 中 and 和 or 的短路原则
对于 and 来说: 如果第一个条件的结论为假,那么 and 前后两个条件组成的表达式计算结果一定为假,后面的条件计算机不会进行计算 对于 or 来说: 如果第一个条件的结论为真,那么 or 前后两个 ...
- csharp: FTP Client Library using System.Net.FtpWebRequest
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- win7 x64 +vs2015 + cmake3.10.3编译opencv-3.4.1+opencv_contrib-3.4.1源码,并进行配置
简介: 一直以来都是在ubuntu下使用opencv,最近因为有<图像处理与模式识别>这门课,需要使用vs2015+opencv提交课程作业,因为opencv官方编译好的exe没有cont ...