首页 > 代码库 > UVALive 4997 ABCD Tiles --DFS
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,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 = 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;}
UVALive 4997 ABCD Tiles --DFS
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。