题意: 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的更多相关文章

  1. UVALive 4998 Simple Encryption --DFS

    题意: 给出K1,求一个12位数(不含前导0)K2,使得K1^K2 mod (10^12) = K2. 解法: 求不动点问题. 有一个性质: 如果12位数K2满足如上式子的话,那么K2%1,K2%10 ...

  2. UVALive 6450 Social Advertising DFS解法

    题意:一些人有朋友关系,在某个人的社交网站上投放广告可以被所有该人的直接朋友看到,问最小投放多少个广告使给出的人都看到广告.(n<=20) 解法:看到n的范围可以想到用二进制数表示每个人被覆盖与 ...

  3. UVALive 6527 Counting ones dfs(水

    题目链接:点击打开链接 #include <cstdio> #include <vector> using namespace std; typedef long long l ...

  4. UVALive 6948 Jokewithpermutation dfs

    题目链接:UVALive 6948  Jokewithpermutation 题意:给一串数字序列,没有空格,拆成从1到N的连续数列. dfs. 可以计算出N的值,也可以直接检验当前数组是否合法. # ...

  5. UVALive - 6436、HYSBZ - 2435 (dfs)

    这两道题都是用简单dfs解的,主要是熟悉回溯过程就能做,据说用bfs也能做 道路修建(HYSBZ - 2435) 在 W 星球上有n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道 ...

  6. 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 ...

  7. UVALive 6663 Count the Regions --离散化+DFS染色

    题意:给你n(n<=50)个矩形(左上角坐标和右下角坐标),问这些矩形总共将平面分成多少个部分.坐标值可能有1e9. 分析:看到n和坐标的范围,容易想到离散化,当时就没想到离散化以后怎么判断区域 ...

  8. UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)

    题意:给一个元素周期表的元素符号(114种),再给一个串,问这个串能否有这些元素符号组成(全为小写). 解法1:动态规划 定义:dp[i]表示到 i 这个字符为止,能否有元素周期表里的符号构成. 则有 ...

  9. UVALive 6884 GREAT + SWERC = PORTO dfs模拟

    题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

随机推荐

  1. 高性能javascript学习笔记系列(1) -js的加载和执行

    这篇笔记的内容主要涉及js的脚本位置,如何加载js脚本和脚本文件执行的问题,按照自己的理解结合高性能JavaScript整理出来的 javascript是解释性代码,解释性代码需要经历转化成计算机指令 ...

  2. asp.net+nopi生成Excel遇到设置单元格值null问题

    Npoi 生成excel报表功能很不错,功能也不用给大家介绍了.首先看遇到的问题吧! FileStream file = new FileStream(Server.MapPath("Tem ...

  3. Android 沉浸式状态栏 实现方式二 ( 更简单 )

    以前写过一个沉浸式状态栏 的实现方式 Android 沉浸式状态栏 实现方式一 现在有个更为简单的实现方式 . 相关链接 http://www.apkbus.com/forum.php?mod=vie ...

  4. 你真的了解UIGestureRecognizer吗?

    一:首先查看一下关于UIGestureRecognizer的定义 //当前手势状态 typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { //尚 ...

  5. 找window的三种方法

    LoginViewController * loginVC = [[LoginViewController alloc]init]; 找window的三种方式 1.// UIWindow * wind ...

  6. UI中一些不常用的控件UIActivityIndicatorView、UIProgressView、UISegmentedControl、UIStepper、UISwitch、UITextView、UIAlertController

    //UIActivityIndicatorView //小菊花,加载 #import "ActivityIndicatorVC.h" @interface ActivityIndi ...

  7. C语言中的运算符

    1. 在C语言中运算符包括:算术运算符.关系运算符.赋值运算符.逻辑运算符 2.用运算符把变量.常量连接起来的式子就是表达式 3.我们阅读一个表达式,从表达式的功能和表达式的值来看 4. 算术运算符和 ...

  8. Git 的 .gitignore 配置

    .gitignore 配置文件用于配置不需要加入版本管理的文件,配置好该文件可以为我们的版本管理带来很大的便利,以下是个人对于配置 .gitignore 的一些心得. 1.配置语法: 以斜杠“/”开头 ...

  9. jQuery jqGrid中ColModel的参数大全

    ColModel 是jqGrid里最重要的一个属性,设置表格列的属性. 用法: java 代码: jQuery("#gridid").jqGrid({  ...     colMo ...

  10. yii2超好用的日期组件和时间组件

    作者:白狼 出处:http://www.manks.top/yii2_datetimepicker.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接 ...