题意: 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相关推荐

  1. UVALive 4997 ABCD Tiles

    题意: 给出n n 的方阵,在.上填 BCD 要求填的位置上,八个方向都不可以重色. 思路: 自己训练做的时候就很智障... 枚举四个方向是否为点 , 4个方向+自己 的八个方向是否有同色砖头 #in ...

  2. uvalive 4997 ABCD Tiles

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

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

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

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

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

  5. 【割点 dfs】UVALive - 7456 Least Crucial Node

    Problem Description 给你n,s,m分别代表n个点,s为特殊点,m条边.让你求去掉那个点?使得其他点不能到达s点的点最多.如果存在割点,一样多的.输出编号最小的. 思路: 割点的条件 ...

  6. UVALive - 7456 Least Crucial Node ( dfs + set )

    直接暴力求解,枚举每个点, dfs 求解对后面影响的点的个数 #include <iostream> #include <cstdio> #include <string ...

  7. UVALive 4126 (LA 4126) Password Suspects AC自动机 + DP + 剪枝dfs

    题目大意: 白书练习题 就是给了M(0 <= M <= 10)个长度不超过10的串, 现在问长度为N(N <= 25)的包含所有这M个串作为子串的串有多少种 如果种数<=42按 ...

  8. (POJ-3279)Fliptile (dfs经典---也可以枚举)

    Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He ha ...

  9. 杭电1044java实现dfs bfs

    Collect More Jewels 问题描述 它写在"夫人的书:创世之后,残酷的神摩洛克反抗了造物主马尔杜克的权威.摩尔从马尔杜克那里偷走了众神中所有神器中最强大的一件,也就是叶多尔的护 ...

最新文章

  1. Java开发字符串JSON处理
  2. Spark详解(四):Spark组件以及消息通信原理
  3. stm32看门狗_「正点原子NANO STM32开发板资料连载」第十一章 独立看门狗实验
  4. 关于写文本文件的问题
  5. PYG教程【四】Node2Vec节点分类及其可视化
  6. Android应用开发—Application
  7. 微信做了个新功能,网友并不买账:就为了给QQ充会员?
  8. bootstrap学习记录
  9. python微信语音转发方法_最全的微信语音转发方法,最简单的方式大家已经帮你选出来了...
  10. 收藏!豆瓣9.0分TOP100职场终极必读书单!大萌哥整理
  11. 四种常见的颜色模式及各自的特点?
  12. c语言不报错但输不出正确结果,正则表达式,c++_C语言 正则表达式结果不对?,正则表达式,c++ - phpStudy...
  13. iOS pch文件配置
  14. 成都拓嘉启远:拼多多直通车推广怎么做才能有开好
  15. ICP、PL-ICP、PP-ICP、GICP对比
  16. 暑假计算机培训心得体会,暑期培训心得体会模板集锦10篇
  17. 2021-02-26构造函数
  18. sprintf() 格式化输出函数
  19. 梧桐新叶让我怀念父亲
  20. 关于大学生如何轻松找到高薪工作

热门文章

  1. Pr:脱机文件及处理方法
  2. 一口气实现交通大数据爬取与Python可视化(含数据分享)
  3. Android中颜色设置
  4. 制作批处理(bat)文件一键安装MongoDB并给其设置账号及权限
  5. 如何在outlook里面把收件箱分组,以便快速的查看最重要的email
  6. python情感分析语料库_利用Python实现中文情感极性分析
  7. vuex中 修改返回的数据
  8. java版Spring Cloud+Vue 前后端分离+b2b2c多商家入驻电子商务源码
  9. 【Spring Cloud】 Gateway网关 之 那些好玩的网关过滤器
  10. Week Of Code 28