SGU 125.Shtirlits
时间限制:0.25s
空间限制:4M
题意:
有N*N的矩阵(n<=3),对所有i,j<=n有G[i][j]<=9,定义f[i][j]为G[i][j]四周大于它的数的个数(F[i][j]<=4),
现在 给出n和F[i][j],输出一种可形的G。
Sample Input
3
1 2 1
1 2 1
1 1 0
Sample Output
1 2 3
1 4 5
1 6 7
Solution:
观察给出的F矩阵,以样例为例
| 1 | 2 | 1 |
| 1 | 2 | 1 |
| 1 | 1 | 0 |
首先知道
F[3][3]==0,那么G[3][3]一定是最大的,令当前填的数为K(K=N*N)
这时将F[3][3],四周的所有F[i][j]减1,变成
| 1 | 2 | 1 |
| 1 | 2 | 0 |
| 1 | 0 | # |
(#号代表已填)
这样重复上面的步骤,每次做完执行k--
直到发现
| 1 | 2 | 0 |
| 0 | 0 | # |
| # | # | # |
这时对应的G为
| * | * | * |
| * | * | 7 |
| 6 | 8 | 9 |
(*代表还未填)
F出现两个以上接触的0,那么同时填这些接触的0为K
此时F矩阵为
| 0 | 1 | 0 |
| # | # | # |
| # | # | # |
G矩阵为
| * | * | * |
| 5 | 5 | 7 |
| 6 | 8 | 9 |
最后得到G矩阵
| 3 | 3 | 4 |
| 5 | 5 | 7 |
| 6 | 8 | 9 |
这样就得到了一种满足要求的输出
最后总结就是,令k=n*n,对F填一个F[i][j]==0的位置为k,如果有联通的0,将这些为0的位置全部填为K,
再将填了数的位置的四周的F[i][j]减一。
如果填完所有0的位置后,G矩阵已经填完那么输出G
G没有填完的话,输出“No Solution”;
参考代码:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
struct node {
int x, y;
} p;
int dirx[4] = {0, 0, -1, 1}, diry[4] = {1, -1, 0, 0};
int g[5][5], f[5][5], pd[5][5];
int n, t, k;
queue<node> ql;
void BFS (int x, int y, int k) {
node p;
for (int i = 0; i <= 3; i++) {
p.x = x + dirx[i], p.y = y + diry[i];
if (f[p.x][p.y] == 0) {
g[p.x][p.y] = k, t++;
f[p.x][p.y] = -1, pd[p.x][p.y] = 1;
BFS (p.x, p.y, k);
}
else if (f[p.x][p.y] > 0)
if ( (--f[p.x][p.y]) == 0) ql.push (p);
}
}
int main() {
cin >> n;
memset (f, -1, sizeof f);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
cin >> f[i][j];
if (f[i][j] == 0) {
p.x = i, p.y = j;
ql.push (p);
}
}
k = n * n;
for (node p; !ql.empty(); ql.pop(), k--) {
p = ql.front();
if (pd[p.x][p.y]) continue;
pd[p.x][p.y] = 1, g[p.x][p.y] = k, f[p.x][p.y] = -1, t++;
BFS (p.x , p.y, k);
}
if (t != n * n) cout << "NO SOLUTION";
else
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
cout << g[i][j] << ' ';
cout << endl;
}
return 0;
}
SGU 125.Shtirlits的更多相关文章
- sgu 125 Shtirlits dfs 难度:0
125. Shtirlits time limit per test: 0.25 sec. memory limit per test: 4096 KB There is a checkered fi ...
- SGU 125 Shtirlits 搜索+可行性剪枝
500ms时限406ms水过…… 直接枚举肯定超时,需要剪枝. 枚举每个格子的元素,检查其左上角和正上方格子是否满足条件,若不满足不必再向下搜索. 在 这里 看到一个更好的方法: 枚举每个格子是哪个相 ...
- Shtirlits - SGU 125(搜索)
题目大意:B[i, j]表示周围有多少个比它大的数,能否用B数组构造出一个A数组,如果不能输出“NO SOLUTION”. 分析:数据规模比较小,可以直接暴力枚举每个点的值. 代码如下: #inclu ...
- ACM 暴力搜索题 题目整理
UVa 129 Krypton Factor 注意输出格式,比较坑爹. 每次要进行处理去掉容易的串,统计困难串的个数. #include<iostream> #include<vec ...
- SGU 分类
http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...
- 今日SGU 5.18
SGU 125 题意:给你一个数组b[i][j],表示i,j的四周有多少个数字大于它的,问你能不能构造出一个a矩形 收获:dfs + 剪枝 一行一行的dfs,然后第一行去枚举0-9,下一行判断当前选 ...
- Entity Framework 6 Recipes 2nd Edition(12-5)译 -> 自动删除相关联实体
12-5. 自动删除相关联实体 问题 当一个实体被删除时,你想自动删除它相关联的实体 解决方案 假设你有一个表结构由一个course (科目), course 的classes (课程),以及enro ...
- FineUI(开源版)v4.2.2发布(8年125个版本,官网示例突破300个)!
开源版是 FineUI 的基石,从 2008 年至今已经持续发布了 120 多个版本,拥有会员 15,000 多位,捐赠会员达到 1,200 多位. FineUI(开源版)v4.2.2 是 8 年 ...
- 每周一书-编写高质量代码:改善C程序代码的125个建议
首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10 ...
随机推荐
- 如何优雅的输出PHP调试信息
经常因为出现紧急bug而被老板骂的同事,为了更快的修复而直接利用线上的错误环境现场debug,并直接在页面上echo和dump.结果被老板发现了,又是一通臭骂.那么有没有什么办法更优雅的输出PHP调试 ...
- HDOJ/HDU 1039 Easier Done Than Said?(字符串处理~)
Problem Description Password security is a tricky thing. Users prefer simple passwords that are easy ...
- 折腾iPhone的生活——通过设置使iPhone更省电
入手了iPhone5s,上手感觉iPhone没有过去省电了,可能是iOS7的关系,也有可能是我一直在下应用的关系,但是iPhone5s那1500mA的电池的确是有点真的不那么够用的样子,通过设置来省电 ...
- sql2005如何附加数据库
1.首先把mdf(数据库主文件)和ldf(数据库日志文件)放到C:\Program Files (x86)\Microsoft SQL Server\MSSQL.1\MSSQL\Data 2.登陆sq ...
- 【内部竞聘】华东/华南 -区域招商高级经理/经理 - 荐才纳贤 - 京东内部论坛 - Powered by Discuz!
[内部竞聘]华东/华南 -区域招商高级经理/经理 - 荐才纳贤 - 京东内部论坛 - Powered by Discuz! [内部竞聘]华东/华南 -区域招商高级经理/经理 [复制链接] ...
- postgresql的/d命令
ostgreSQL-psql常用命令 文章索引 [隐藏] \d命令 \d命令 1 2 3 格式: \d [ pattern ] \d [ pattern ] + 该命令将显示每个匹配关系(表,视图 ...
- 国内maven 仓库
国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用.osChina 貌似仓库一年前关闭了 repo2<mirror> <id>re ...
- BufferedInputStream,FileInputStream,FileChannel实现文件拷贝
从上篇文章中知道BufferedInputStream是自带缓冲区的输入流,可以大大减少IO次数,提供效率.下面的例子中实现了用BufferedInputStream与FileInputStream实 ...
- sql 视图 按where条件多个字段取一个 分类: SQL Server 2014-12-01 14:09 308人阅读 评论(0) 收藏
首先介绍一下 Case ..When...Then..End 的用法: CASEJiXiaoFind_RowID WHEN '1' THENJiXiao_Money1 WHEN '2' THEN ...
- XML认识
XML概念 XML是eXtensible Markup Langguage 缩写,称之为可扩展标记语言.XML 被设计用来传输和存储数据.与HTML不同的是: HTML被设计用来显示数据,其焦点是数据 ...