CodeForces 44J - Triminoes -搜索转构造

来源:互联网 发布:windows纸牌必胜攻略 编辑:程序博客网 时间:2024/06/08 02:17

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20077

给你一个n*m的图,图上有‘.’代表挖走了的瓷砖,剩下的是 用w,b分别表示白色黑色的瓷砖

要求找出所有的 “ wbw ”这样的瓷砖,替换成 aaa/bbb/ccc/ddd 任意一个

问你能否把所有的w/b瓷砖按照上述规则替换成   aaa/bbb/ccc/ddd  并且要求,用连续三个字母替换之后的瓷砖不能和相同字母相邻

也就是  不能 aaaaaa 但是可以aaabbb


一开始想dfs ,找出所有 只连接着一个b 的w (此W 必然只能往b的方向填) .我们把这样只有一个方向发展的w成为 度数为1

先找出所有度数为1的w 填掉,再重新搜 不断 找度数为1的w,直到整个图找不到度数为1的w,此时检查 整个图是否填好了

如果没,则不存在方案, 其次 在填的过程中要注意判断 是否能 完整填上三个瓷砖。。。一直wa  on test 32


后来发现,从图的第一行第一列开始 按从左到右从上到下的顺序遍历每一个点,对于每一个W,如果他的左边是‘b’ ,则这个W一定往右填 (否则这个b无法被填上),如果他的左边不是‘b’,那么他只能往下填

按照这样的思路,每一个w只需要判断往下还是往右填,填的时候 判断颜色是否冲突,自己与所要填的方向的瓷砖是否恰为 wbw 

这样  只需要 遍历遍 ,就可以构造出答案


复杂度 O(n*m) 

细节见代码


x

#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include<queue>using namespace std; int dx_down[8]={-1,0,1,2,3,2,1,0};int dy_down[8]={0,-1,-1,-1,0,1,1,1};int dx_right[8]={0,1,1,1,0,-1,-1,-1};int dy_right[8]={-1,0,1,2,3,2,1,0};int n,m;char mp[1005][1005];char vis[1005][1005];int col=0;int getcol(){if (col<3)col++;elsecol=0;return col;}int check(int tmp,int dir,int x,int y)//判断往下填的话,颜色tmp是否与周围有冲突{int i;if (dir==1){for (i=0;i<8;i++){int xx=x+dx_down[i];int yy=y+dy_down[i];if (!(xx>=1&&xx<=n&&yy>=1&&yy<=m)) continue;if (vis[xx][yy]=='a'+tmp) return 1;  //need to change col}return 0;}else if (dir==2){ for (i=0;i<8;i++){int xx=x+dx_right[i];int yy=y+dy_right[i];if (!(xx>=1&&xx<=n&&yy>=1&&yy<=m)) continue;if (vis[xx][yy]=='a'+tmp) return 1;  //need to change col}return 0;}}int main(){ int i,j;scanf("%d%d",&n,&m);getchar();for (i=1;i<=n;i++){for (j=1;j<=m;j++){scanf("%c",&mp[i][j]);}getchar();}int bukeyi=0;for (i=1;i<=n;i++){for (j=1;j<=m;j++){if (mp[i][j]=='.'||vis[i][j]) continue;if (mp[i][j]=='w'){col=getcol();int change_times=5;//如果转了5次颜色 才跳出循环,必然说明不存在合法的颜色可以被填if (mp[i][j+1]!='b'||(mp[i][j+1]=='b'&&vis[i][j+1]=='b'))//往下填  //mp[i][j]=='b'不一定往右填,这个b可能是bbb中的b而不是wbw的b{while(check(col,1,i,j)&&change_times--)  //改变颜色直到合法或者换了4次以上col=getcol();if (change_times==0) {bukeyi=1;break;}  //找不到合法的颜色if (!(mp[i][j]=='w'&&mp[i+1][j]=='b'&&mp[i+2][j]=='w'))//判断是否存在wbw{bukeyi=1;break;}mp[i][j]=col+'a';mp[i+1][j]=col+'a';mp[i+2][j]=col+'a';vis[i][j]=col+'a';vis[i+1][j]=col+'a';vis[i+2][j]=col+'a';}else //往you填{while(check(col,2,i,j)&&change_times--)col=getcol();if (change_times==0) {bukeyi=1;break;}if (!(mp[i][j]=='w'&&mp[i][j+1]=='b'&&mp[i][j+2]=='w'))   {bukeyi=1;break;}mp[i][j]=col+'a';mp[i][j+1]=col+'a';mp[i][j+2]=col+'a';vis[i][j]=col+'a';vis[i][j+1]=col+'a';vis[i][j+2]=col+'a';}}}if (bukeyi) break;}if (bukeyi){printf("NO\n");return 0;}printf("YES\n");for (i=1;i<=n;i++){for (j=1;j<=m;j++){printf("%c",mp[i][j]);}printf("\n");}return 0;} 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鱼刺长在喉咙里怎么办 吃到鱼刺卡喉咙怎么办 带鱼刺扎进喉咙怎么办 喉咙被鱼刺卡了怎么办 喉咙里卡了鱼刺怎么办 卡了鱼刺在喉咙怎么办 日剧 哥哥太爱我怎么办 被竹叶青蛇咬了怎么办 被眼镜王蛇咬了怎么办 被黄蜂蛰了怎么办消肿 被黑色黄蜂蜇了怎么办 手指被黄蜂蛰了怎么办 被马蜂蛰了肿了怎么办 给青竹蛇咬了怎么办 被青竹蛇咬了怎么办 孕早期吃了桂皮怎么办? 怀孕后吃了八角怎么办 孕妇吃了点八角怎么办 煮粥老是溢出来怎么办 6个月的小孩咳嗽怎么办 10个月婴儿咳嗽怎么办 6个月婴儿感冒了怎么办 六个月宝宝有痰怎么办 9月婴儿牛奶过敏怎么办 一用粉底就过敏怎么办 7个月婴儿过敏怎么办 9个月宝宝腹泻怎么办 9个月宝宝拉肚子怎么办 5个月宝宝拉肚子怎么办 九个月大宝宝拉肚子怎么办 九个半月的宝宝拉肚子怎么办 9个月婴儿拉稀怎么办 九个月的宝宝拉肚子怎么办 9个月宝宝拉稀水怎么办 2岁宝宝腹泻拉水怎么办 18个月宝宝拉水怎么办 2个月宝宝拉稀水怎么办 2个月的宝宝腹泻怎么办 2个月的宝宝拉稀怎么办 宝宝不喝补液盐怎么办 4个月宝宝腹泻怎么办