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 ...
随机推荐
- VS2010在64位系统中连接64位Oracle出现的问题和解决方法
C#使用System.Data.OracleClient连接Oracle数据库.我的是window7/64位系统,装了一个64位的oralce 11G r2 客户端是64位的 用VS10调试错误信息如 ...
- [实现]Javascript代码的另一种压缩与加密方法——代码图片转换
代码=图片 图片=代码 JS代码对于喜欢F12的同志来说,连个遮羞布都没有... 虽然把代码变成图片也仅仅只是增加一层纱布而已...但这方法还是挺好玩的,而且代码也被压缩了一点. 第一次看到[图片=代 ...
- 设置跨域的iframe的高度
原因 如下图,A域中有个B域的页面,但是B的页面的长度不确定,A无法去设置一个准确的高度. PS:iframe高度设置auto是无效的 解决办法 如上图, (1)在B页面中加一个A的代理页面的ifra ...
- Jquery在线引用地址
Jquery在线引用地址: 1. 很多网站都是使用这种方式引入,客户的浏览器可能已经缓存过了 jquery.可以直接调用本地的,速度更快… 2. Google code 使用了 cdn 技术在很多地方 ...
- iOS常用第三方库
1.AFNetworking 轻量级的通讯类库,使用非常简单. 下载地址:https://github.com/AFNetworking/AFNetworking 2.FMDB fmdb是一个数据 ...
- SQLMAP使用笔记
-u #注入点-f #指纹判别数据库类型-b #获取数据库版本信息-p #指定可测试的参数(?page=1&id=2 -p “page,id”)-D “” #指定数据库名-T “” #指定表名 ...
- 如何删掉Portal中的无效内容
1.登陆到https://[PORTALURL]/arcgis/sharing/rest/ 2.使用内容的所有者或者门户管理员的账号登陆. 3.登陆后访问https://[PORTALURL]/arc ...
- Sharepoint 2010 无法上传文件的问题
现象: 用户拥有某文档库的参与讨论权限,但是点击“上传文件”时,系统提示当前用户没有权限 (Access Denied) . 某用户拥有某文档库的参与讨论权限,“上传单个文件”按键是可以用的,但是“上 ...
- VMware Data Recovery备份恢复vmware虚拟机
VMware Data Recovery 是VMware虚拟机备份工具,可创建虚拟机备份,同时不会中断虚拟机的使用或虚拟机提供的数据和服务.Data Recovery 管理现有备份,并在这些备份过时后 ...
- ViewPager的使用小技巧
1.在ViewPager中默认加载当前屏幕上的界面和左右相邻界面的数据从而实现页面滑动的快速切换.可以通过调用setOffscreenPageLimit(int)方法,定制预加载相邻页面的数目. 2. ...