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 ...
随机推荐
- 【HTML5】浅析html使用SSE(Server-Sent Events)连接JSP
目录结构: // contents structure [-] 关于SSE的一些话 什么是SSE SSE的浏览器支持情况 SSE的工作机制 使用SSE连接JSP文件 HTMl页面 服务器端 错误 错误 ...
- Ajax关于readyState(状态值)和status(状态码)的研究
var getXmlHttpRequest = function () { try{ //主流浏览器提供了XMLHttpRequest对象 return new XMLHttpRequest(); } ...
- go语言条件语句 if else
示例: if a < 5 { return 0 } else { return 1 } 关于条件语句,需要注意以下几点: 条件语句不需要使用括号将条件包含起来(): 无论语句体内有几条语 ...
- 1:时间戳转换成年月日函数,2:url截取参数方法,3:弹窗自定义方法 4:点击按钮加入购物车
最近一直在使用vue.js来构建项目,先分享一下一些简单可复用的函数. 1:时间戳转换Date.prototype.format = function(fmt){ //author: yumeiqia ...
- Javascript 面向对象编程初探(一)--- 封装
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...
- MyEclispe 2015 CI 15发布(附下载)
MyEclipse 2015 CI 15带来了一些程序上的改进,包括可外部部署的JavaScript调 试,改进了 REST Inspect 和 WebSphere 框架支持,新增服务器连接器,另外还 ...
- git 删除远程源,新增加源
git remote remove origin git remote add origin git@XXXX
- iOS 设置系统屏幕亮度
// 设置系统屏幕亮度 // [UIScreen mainScreen].brightness = value; // 或者 [[UIScreen mainScreen] se ...
- 记一次eclipse无法启动的排查过程
起因是本地为开发工程打包,总是提示 source 1.3 不支持注释.enum等等,但询问开发开发表示自己本地打包正常. 于是排查版本问题.开发的jdk是1.6版本,自己的是1.7,于是想要不降级吧, ...
- luemn PHP_CodeSniffer的安装
1.PHP_CodeSniffer是PEAR中的一个用PHP5写的用来检查嗅探PHP代码是否有违反一组预先设置好的编码标准的一个包,它是确保你的代码简洁一致的必不可少的开发工具,甚至还可以帮助程序员减 ...