题意: 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. 详细解读XMLHttpRequest(一)同步请求和异步请求

    本文主要参考:MDN XMLHttpRequest 让发送一个HTTP请求变得非常容易.你只需要简单的创建一个请求对象实例,打开一个URL,然后发送这个请求.当传输完毕后,结果的HTTP状态以及返回的 ...

  2. 使用js实现带有停顿效果的图片滚动(按钮控制)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 总结CSS3新特性(颜色篇)

    颜色: CSS3新增加了hsl(), hsla(), rgb(),rgba()四个函数来创建color值; hsl(): hsl函数:h(色调),s(饱和度),l(亮度); 色调:为0-360之间的数 ...

  4. SAP 中的用户类型

    在使用 SU01 维护用户时,在登录数据选项卡中会要求选择用户类型,一般我们都选择第一项 Dialog,但是其他几个选项有什么作用呢?下面我们就一一解释. 对话用户顾名思义,就是需要通过 SAP GU ...

  5. EWS API 2.0读取日历信息-读取内容注意事项

    采用模拟账号的方式读取日历信息,注意下日历的内容读取(Body)读取.代码如下:(采用 EWS API 2.0版本) 1.读取内容前必须设置如下属性:否则会提示:You must load or as ...

  6. ArcSDE安装注意事项

    今天因为测试需要配置环境,因此在本机上安装了ArcSDE 9.3 for Oracle11g,但是发现安装完之后服务(esri_sde)出现了启动后又立马停止的问题,解决方法如下: 1)检查Oracl ...

  7. SharePoint 2013 版本号和相关问题介绍

    今天查SharePoint 补丁,无意间发现一个非常好的链接,分享给大家! 这里面有SharePoint近期的版本号,而且不断更新,还有每个补丁可能带来的问题,对于服务器经常需要打补丁的那是非常有用, ...

  8. JavaScript MVC框架和语言总结[infoq]

    infoq关于javascript的语言和框架的总结,非常全面,值得一读. http://www.infoq.com/minibooks/emag-javascript Contents of the ...

  9. 转 java中static{}语句块详解

    原文地址:http://blog.csdn.net/lubiaopan/article/details/4802430     感谢原作者! static{}(即static块),会在类被加载的时候执 ...

  10. android加固系列—5.加固前先学会破解,hook(钩子)jni层系统api

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5138585.html] crackme项目jni的关键代码(项目地址见文章底部),获取当前程序 ...