UVALive 4997 ABCD Tiles --DFS
题意: NxN的地图,上面有A颜色的瓷砖以及一些空格点,要用B,C,D颜色去填充这些空格,只能十字形的填充,还要保证共角或共边的格子不能是相同颜色,求一种字典序最小的填充方法,如果不能,输出"Not Possible"。
解法: 从上往下扫,如果有空格,那么一定是以它下面那个格子为中心填十字瓷砖才能填到这个空格,所以这个我们将这个空格标个号,并且把下面的三个和下下面的一个空格赋一下别的值,不让以后扫描扫到,那些不是空格的话,直接跳出即可。这样我们可以找到所有需要填的十字形瓷砖个数,并且知道格子的位置,那么接下来只要考虑染什么色的事情了,因为只有三种颜色,所以dfs去填即可,如果到某一状态发现哪种颜色都不能填,那么回溯。这样一直到成功找到染色方案位置。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std; char mp[][];
int n,tot;
int col[];
bool OK(int x,int y) { return x >= && x < n && y >= && y < n; }
bool findcolor(int i,int j,char ch) {
memset(col,,sizeof(col));
if(OK(i+,j+) && mp[i+][j+] != '.') col[mp[i+][j+]-'A']++;
if(OK(i+,j-) && mp[i+][j-] != '.') col[mp[i+][j-]-'A']++;
if(OK(i-,j-) && mp[i-][j-] != '.') col[mp[i-][j-]-'A']++;
if(OK(i-,j+) && mp[i-][j+] != '.') col[mp[i-][j+]-'A']++;
for(int k=j-;k<=j+;k++) if(OK(i+,k) && mp[i+][k] != '.') col[mp[i+][k]-'A']++;
for(int k=i-;k<=i+;k++) if(OK(k,j+) && mp[k][j+] != '.') col[mp[k][j+]-'A']++;
for(int k=j-;k<=j+;k++) if(OK(i-,k) && mp[i-][k] != '.') col[mp[i-][k]-'A']++;
for(int k=i-;k<=i+;k++) if(OK(k,j-) && mp[k][j-] != '.') col[mp[k][j-]-'A']++;
if(col[ch-'A']) return true;
return false;
}
void color(int i,int j,char ch) {
mp[i][j] = mp[i-][j] = mp[i][j+] = mp[i+][j] = mp[i][j-] = ch;
}
struct node {
int x,y;
node(int _x,int _y):x(_x),y(_y){}
node(){}
}p[]; bool dfs(int c) {
if(c == tot) return true;
c++;
int x = p[c].x, y = p[c].y;
for(int i=;i<=;i++) { //B,C,D
if(!findcolor(x,y,'A'+i)) { //周边有没有'A'+i这种颜色
color(x,y,'A'+i);
if(dfs(c)) return true;
color(x,y,'.');
}
}
return false;
} int main()
{
int t,cs = ,i,j,k,h;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int space = ;
for(i=;i<n;i++)
scanf("%s",mp[i]);
int flag = ;
tot = ;
for(i=;i<n;i++) {
for(j=;j<n;j++) {
if(mp[i][j] == '.') {
for(k=j-;k<=j+;k++) {
if(!OK(i+,k) || mp[i+][k] != '.') { flag = ; break; }
else mp[i+][k] = '#';
}
if(!OK(i+,j) || mp[i+][j] != '.') { flag = ; break; }
else mp[i+][j] = '#';
p[++tot] = node(i+,j); //着色中心点
}
}
}
printf("Case %d:",cs++);
if(!flag) { puts(" Not Possible!"); continue; }
if(dfs()) {
puts("");
for(i=;i<n;i++)
{
for(j=;j<n;j++)
printf("%c",mp[i][j]);
puts("");
}
}
else puts(" Not Possible!");
}
return ;
}
UVALive 4997 ABCD Tiles --DFS的更多相关文章
- UVALive 4998 Simple Encryption --DFS
题意: 给出K1,求一个12位数(不含前导0)K2,使得K1^K2 mod (10^12) = K2. 解法: 求不动点问题. 有一个性质: 如果12位数K2满足如上式子的话,那么K2%1,K2%10 ...
- UVALive 6450 Social Advertising DFS解法
题意:一些人有朋友关系,在某个人的社交网站上投放广告可以被所有该人的直接朋友看到,问最小投放多少个广告使给出的人都看到广告.(n<=20) 解法:看到n的范围可以想到用二进制数表示每个人被覆盖与 ...
- UVALive 6527 Counting ones dfs(水
题目链接:点击打开链接 #include <cstdio> #include <vector> using namespace std; typedef long long l ...
- UVALive 6948 Jokewithpermutation dfs
题目链接:UVALive 6948 Jokewithpermutation 题意:给一串数字序列,没有空格,拆成从1到N的连续数列. dfs. 可以计算出N的值,也可以直接检验当前数组是否合法. # ...
- UVALive - 6436、HYSBZ - 2435 (dfs)
这两道题都是用简单dfs解的,主要是熟悉回溯过程就能做,据说用bfs也能做 道路修建(HYSBZ - 2435) 在 W 星球上有n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道 ...
- Codeforces Round #292 (Div. 2) D. Drazil and Tiles [拓扑排序 dfs]
传送门 D. Drazil and Tiles time limit per test 2 seconds memory limit per test 256 megabytes Drazil cre ...
- UVALive 6663 Count the Regions --离散化+DFS染色
题意:给你n(n<=50)个矩形(左上角坐标和右下角坐标),问这些矩形总共将平面分成多少个部分.坐标值可能有1e9. 分析:看到n和坐标的范围,容易想到离散化,当时就没想到离散化以后怎么判断区域 ...
- UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
题意:给一个元素周期表的元素符号(114种),再给一个串,问这个串能否有这些元素符号组成(全为小写). 解法1:动态规划 定义:dp[i]表示到 i 这个字符为止,能否有元素周期表里的符号构成. 则有 ...
- UVALive 6884 GREAT + SWERC = PORTO dfs模拟
题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...
随机推荐
- 高性能javascript学习笔记系列(1) -js的加载和执行
这篇笔记的内容主要涉及js的脚本位置,如何加载js脚本和脚本文件执行的问题,按照自己的理解结合高性能JavaScript整理出来的 javascript是解释性代码,解释性代码需要经历转化成计算机指令 ...
- asp.net+nopi生成Excel遇到设置单元格值null问题
Npoi 生成excel报表功能很不错,功能也不用给大家介绍了.首先看遇到的问题吧! FileStream file = new FileStream(Server.MapPath("Tem ...
- Android 沉浸式状态栏 实现方式二 ( 更简单 )
以前写过一个沉浸式状态栏 的实现方式 Android 沉浸式状态栏 实现方式一 现在有个更为简单的实现方式 . 相关链接 http://www.apkbus.com/forum.php?mod=vie ...
- 你真的了解UIGestureRecognizer吗?
一:首先查看一下关于UIGestureRecognizer的定义 //当前手势状态 typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { //尚 ...
- 找window的三种方法
LoginViewController * loginVC = [[LoginViewController alloc]init]; 找window的三种方式 1.// UIWindow * wind ...
- UI中一些不常用的控件UIActivityIndicatorView、UIProgressView、UISegmentedControl、UIStepper、UISwitch、UITextView、UIAlertController
//UIActivityIndicatorView //小菊花,加载 #import "ActivityIndicatorVC.h" @interface ActivityIndi ...
- C语言中的运算符
1. 在C语言中运算符包括:算术运算符.关系运算符.赋值运算符.逻辑运算符 2.用运算符把变量.常量连接起来的式子就是表达式 3.我们阅读一个表达式,从表达式的功能和表达式的值来看 4. 算术运算符和 ...
- Git 的 .gitignore 配置
.gitignore 配置文件用于配置不需要加入版本管理的文件,配置好该文件可以为我们的版本管理带来很大的便利,以下是个人对于配置 .gitignore 的一些心得. 1.配置语法: 以斜杠“/”开头 ...
- jQuery jqGrid中ColModel的参数大全
ColModel 是jqGrid里最重要的一个属性,设置表格列的属性. 用法: java 代码: jQuery("#gridid").jqGrid({ ... colMo ...
- yii2超好用的日期组件和时间组件
作者:白狼 出处:http://www.manks.top/yii2_datetimepicker.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接 ...