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[20][20]; int n,tot; int col[4]; bool OK(int x,int y) { return x >= 0 && x < n && y >= 0 && y < n; } bool findcolor(int i,int j,char ch) {memset(col,0,sizeof(col));if(OK(i+1,j+1) && mp[i+1][j+1] != '.') col[mp[i+1][j+1]-'A']++;if(OK(i+1,j-1) && mp[i+1][j-1] != '.') col[mp[i+1][j-1]-'A']++;if(OK(i-1,j-1) && mp[i-1][j-1] != '.') col[mp[i-1][j-1]-'A']++;if(OK(i-1,j+1) && mp[i-1][j+1] != '.') col[mp[i-1][j+1]-'A']++;for(int k=j-1;k<=j+1;k++) if(OK(i+2,k) && mp[i+2][k] != '.') col[mp[i+2][k]-'A']++;for(int k=i-1;k<=i+1;k++) if(OK(k,j+2) && mp[k][j+2] != '.') col[mp[k][j+2]-'A']++;for(int k=j-1;k<=j+1;k++) if(OK(i-2,k) && mp[i-2][k] != '.') col[mp[i-2][k]-'A']++;for(int k=i-1;k<=i+1;k++) if(OK(k,j-2) && mp[k][j-2] != '.') col[mp[k][j-2]-'A']++;if(col[ch-'A']) return true;return false; } void color(int i,int j,char ch) {mp[i][j] = mp[i-1][j] = mp[i][j+1] = mp[i+1][j] = mp[i][j-1] = ch; } struct node {int x,y;node(int _x,int _y):x(_x),y(_y){}node(){} }p[255];bool dfs(int c) {if(c == tot) return true;c++;int x = p[c].x, y = p[c].y;for(int i=1;i<=3;i++) { //B,C,Dif(!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 = 1,i,j,k,h;scanf("%d",&t);while(t--){scanf("%d",&n);int space = 0;for(i=0;i<n;i++)scanf("%s",mp[i]);int flag = 1;tot = 0;for(i=0;i<n;i++) {for(j=0;j<n;j++) {if(mp[i][j] == '.') {for(k=j-1;k<=j+1;k++) {if(!OK(i+1,k) || mp[i+1][k] != '.') { flag = 0; break; }else mp[i+1][k] = '#';}if(!OK(i+2,j) || mp[i+2][j] != '.') { flag = 0; break; }else mp[i+2][j] = '#';p[++tot] = node(i+1,j); //着色中心点 }}}printf("Case %d:",cs++);if(!flag) { puts(" Not Possible!"); continue; }if(dfs(0)) {puts("");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%c",mp[i][j]);puts("");}}else puts(" Not Possible!");}return 0; }
View Code
转载于:https://www.cnblogs.com/whatbeg/p/4232097.html
UVALive 4997 ABCD Tiles --DFS相关推荐
- UVALive 4997 ABCD Tiles
题意: 给出n n 的方阵,在.上填 BCD 要求填的位置上,八个方向都不可以重色. 思路: 自己训练做的时候就很智障... 枚举四个方向是否为点 , 4个方向+自己 的八个方向是否有同色砖头 #in ...
- uvalive 4997 ABCD Tiles
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 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 ...
- 【割点 dfs】UVALive - 7456 Least Crucial Node
Problem Description 给你n,s,m分别代表n个点,s为特殊点,m条边.让你求去掉那个点?使得其他点不能到达s点的点最多.如果存在割点,一样多的.输出编号最小的. 思路: 割点的条件 ...
- UVALive - 7456 Least Crucial Node ( dfs + set )
直接暴力求解,枚举每个点, dfs 求解对后面影响的点的个数 #include <iostream> #include <cstdio> #include <string ...
- UVALive 4126 (LA 4126) Password Suspects AC自动机 + DP + 剪枝dfs
题目大意: 白书练习题 就是给了M(0 <= M <= 10)个长度不超过10的串, 现在问长度为N(N <= 25)的包含所有这M个串作为子串的串有多少种 如果种数<=42按 ...
- (POJ-3279)Fliptile (dfs经典---也可以枚举)
Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He ha ...
- 杭电1044java实现dfs bfs
Collect More Jewels 问题描述 它写在"夫人的书:创世之后,残酷的神摩洛克反抗了造物主马尔杜克的权威.摩尔从马尔杜克那里偷走了众神中所有神器中最强大的一件,也就是叶多尔的护 ...
最新文章
- Java开发字符串JSON处理
- Spark详解(四):Spark组件以及消息通信原理
- stm32看门狗_「正点原子NANO STM32开发板资料连载」第十一章 独立看门狗实验
- 关于写文本文件的问题
- PYG教程【四】Node2Vec节点分类及其可视化
- Android应用开发—Application
- 微信做了个新功能,网友并不买账:就为了给QQ充会员?
- bootstrap学习记录
- python微信语音转发方法_最全的微信语音转发方法,最简单的方式大家已经帮你选出来了...
- 收藏!豆瓣9.0分TOP100职场终极必读书单!大萌哥整理
- 四种常见的颜色模式及各自的特点?
- c语言不报错但输不出正确结果,正则表达式,c++_C语言 正则表达式结果不对?,正则表达式,c++ - phpStudy...
- iOS pch文件配置
- 成都拓嘉启远:拼多多直通车推广怎么做才能有开好
- ICP、PL-ICP、PP-ICP、GICP对比
- 暑假计算机培训心得体会,暑期培训心得体会模板集锦10篇
- 2021-02-26构造函数
- sprintf() 格式化输出函数
- 梧桐新叶让我怀念父亲
- 关于大学生如何轻松找到高薪工作