为了反驳很对劲的太刀流,并不对劲的片手流决定与之针锋相对。

很对劲的太刀流->

2638: 黑白染色

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 177  Solved: 87
[Submit][Status][Discuss]

Description

 你有一个n*m的矩形,一开始所有格子都是白色,然后给出一个目标状态的矩形,有的地方是白色,有的地方是黑色,你每次可以选择一个连通块(四连通块,且不要求颜色一样)进行染色操作(染成白色或者黑色)。问最少操作次数。

Input

第一行两个数n,m表示矩形大小。
  接下来n行描述目标状态,每行m个字符,’W’表示白色,’B’表示黑色。

Output

一行一个整数表示操作数。

Sample Input

3 3
WBW
BWB
WBW

Sample Output

2

HINT

数据规模和约定
  100%的数据n<=50,m<=50
  15%的数据n*m<=15
  另外15%的数据m=1

——————————并不对劲的分界线——————

问:数据怎样?

答:极小!

问:极小的数据该怎么办?

答:网络流!神奇的dp!

然而并不是…有一个游戏(KAMI)是类似的,就是给出这样的一个有几种颜色的图:

每次可以选一个同色的区域,将这个区域染成另一种颜色。要在步数限制内将整个图染成同一种颜色。

有这样一种染色方法:

用三步将中间的部分染灰;

用一步将中间的部分染蓝;

用一步将中间的部分染灰;

用一步将中间的部分染蓝;

用一步将中间的部分染白,就完成了;

总共是3+1+1+1+1=7步,并不知道这是不是最优解。

这个游戏和这道题的区别在于有一个是把有图案的变成空白,另一个是把空白的变成有图案的。会发现这个游戏的操作正好是本题操作的逆变换。因为本游戏一开始是小的同色连通块,染色后是更大的同色连通块(必须是白色)。对于本题而言,如果把有不同颜色的连通块染成了同一颜色,就会让之前的某些操作白做了。这可能不会让总次数变多,但是绝对不可能让总次数变少,所以还是要尽量避免将不同色的染成同色的。那也就是说,这道题就是将大的白色联通块变成小的同色连通块,刚好相反。那么就可以直接将本题当成那个游戏的简化版(只有两种颜色),也就是将目标状态染成全白。

这个游戏的有一种策略就是选一个起点(不同的起点的结果当然不同了,所以要先在选起点上花一番心思),然后将起点所在的同色连通块染成它的边缘的颜色(因为只有两种颜色,所以并不用考虑边缘有多种颜色的情况)。不断重复直至所有点同色。有人可能觉得,将一些小的连通块不断合并次数会更少。考虑两点A,B,将“从黑走到白”或“从白走到黑”称为一步,A到B最少的步数为dis(A,B)。那么无论如何染色,A和B只能在至少dis(A,B)次后才能在同一个同色连通块。所以其实这两种策略的下界都一样, 但是第一种更容易考虑。

随便找一个点(黑白都行)作为起点,假设它的颜色为a,另一种颜色为b。每一次需要把起点所在的连通块染为b色,这样起点所在连通块边缘的那些颜色为b的点就都包含在连通块中了。再将起点所在的连通块染成a色,边缘的那些颜色为a的点就也包含再连通块中了。随便用bfs或者什么最短路算法就可以知道对于每个点,假如以该点为起点,那么一共需要多少步。最后再求个最小值。

还有一点,要是写最短路的话,总共有2500个点,floyd并不能过。但是会发现边数非常小,那么n遍dijkstra就行了。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#define maxn 3020
using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while(isdigit(ch)==0 && ch!='-')ch=getchar();if(ch=='-')f=-1,ch=getchar();while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*f;
}
inline void write(int x)
{int f=0;char ch[20];if(!x){puts("0");return;}if(x<0){putchar('-');x=-x;}while(x)ch[++f]=x%10+'0',x/=10;while(f)putchar(ch[f--]);putchar('\n');
}
typedef struct node
{int x,y;bool operator <(const node &z)const{return(y>z.y);   }
}stnd;
priority_queue<stnd>q;
int dis[maxn],n,m,a,b,x[10]={1,0,-1,0},y[10]={0,1,0,-1},vis[maxn],maxt,ans=0x7fffffff;
char s[60][60];
int getn(int i,int j)
{return (i-1)*m+j;
}
void getxy(int w,int &i,int &j)
{j=w%m==0?m:w%m;i=(w-j)/m+1;
}
void dij(int st)
{memset(dis,-1,sizeof(dis));memset(vis,0,sizeof(vis));dis[st]=0;stnd tmp;tmp.x=st,tmp.y=0;q.push(tmp);while(!q.empty()){int u=q.top().x;q.pop();if(vis[u])continue;vis[u]=1;for(int r=0;r<4;r++){int i,j;getxy(u,i,j);int k=i+x[r],l=j+y[r],v=getn(k,l),w=s[i][j]==s[k][l]?0:1;//if(st==n*n)cout<<i<<" "<<j<<endl;if(k<=0 || k>n || l<=0 || l>m)continue;if(dis[v]>dis[u]+w || dis[v]==-1){dis[v]=dis[u]+w;if(!vis[v]){tmp.x=v,tmp.y=dis[v],q.push(tmp);}}}}maxt=0;for(int i=1;i<=n*m;i++){int xx,yy;getxy(i,xx,yy);if(s[xx][yy]=='B'){/*cout<<xx<<" "<<yy<<" "<<dis[i]<<endl;*/maxt=max(maxt,dis[i]);}}//cout<<maxt<<"+++++++++++"<<endl;ans=min(maxt,ans);
}
int main()
{n=read(),m=read();for(int i=1;i<=n;i++)scanf("%s",s[i]+1);for(int i=1;i<=n*m;i++)dij(i);write(ans+1);return 0;
}
/*
3 3
WBW
BWB
WBW
*/
/*
%%%Wang God orz
%%%Shing God orz
%%%Yangtze River God orz
%%%Bang God orz
%%%Cross God orz
%%%O God orz
%%%Destinies God orz
%%%Everyone Except Me
*/

  

不知道这一题会不会有多种颜色的强化版?如果有,假设共有k种颜色,那么能做到多少的数据范围?还是只能暴搜?

宣传一波电教,欢迎加入。

转载于:https://www.cnblogs.com/xzyf/p/8533375.html

并不对劲的bzoj2638相关推荐

  1. 并不对劲的概率与期望

    并不觉得今天学到了什么东西-感觉像上了数学课一样- 很对劲的太刀流-> 一.枚举法 初二数学就有提到的.不过,有时算出的概率和直觉并不相符,所以并不能直接凭感性认识,并不对劲的人有时还得理性分析 ...

  2. 并不对劲的BJOI2019

    一些感想 现实并非游戏,并不支持反复刷关 猎人和防御工事一起被老山龙摧毁了: 猎人惨死雨中,结云村永无放晴之日: 猎人被狂龙病毒侵蚀,天空山上黑蚀龙泛滥. 好像这才是怪物猎人系列的真实结局呢 day ...

  3. 并不对劲的[USACO07NOV,洛谷p2886]Cow Relays

    题意就是给一张无向有边权的图.起点.终点,求起点到终点经过n条边的最短路.n<=10^6,点的编号<=10^3,边数<=10^2. 这个边数让人不由自主地想到了floyd,然后发现f ...

  4. 结果不对_男子去医院抽血体检,拿到化验单发现不对劲,医院:医生专业不精...

    大家都知道,人的年龄大了身体肯定不如年轻的时候,难免会出现各种问题,所以现在有很多老年人,每年都会定期去医院做体检,发现问题后能够及早治疗.杭州的胡师傅日前去医院看病,顺便做了一个体检,结果医院很多项 ...

  5. 并不对劲的[Noi2008]道路设计

    Time Limit: 20 Sec Memory Limit: 162 MB Submit: 931 Solved: 509  [Submit][Status][Discuss]  Descript ...

  6. 并不对劲的线段树套平衡树

    最近很对劲的太刀流做的一道题中说树是无向连通无环图,并不对劲的片手流为了反驳他,决定与之针锋相对,就练线段无向连通无环图套平衡无向连通无环图的题. 很对劲的太刀流-> 题意非常简单,就是维护一个 ...

  7. 并不对劲的fhq treap

    听说很对劲的太刀流不止会splay一种平衡树,并不对劲的片手流为了反驳他,并与之针锋相对,决定学学高端操作. 很对劲的太刀流-> 据说splay常数极大,但是由于只知道splay一种平衡树能对序 ...

  8. 并不对劲的片手剑使用说明(本博客公告)

    这里是并不对劲的mhp3上位猎人 主玩片手剑/大剑/弓(最近在自闭...) 被很对劲的太刀流称为八个世纪前的老猎人 祝各位狩猎愉快! 转载于:https://www.cnblogs.com/xzyf/ ...

  9. 中学再不学编程就晚了?MIT、JHU研究:程序员大脑思考代码的机制不对劲

    视学算法报道 转载自:机器之心 编辑:泽南.小舟 MIT.约翰霍普金斯大学的研究人员发现,思考编程并不像组织语言,但也不靠纯粹的逻辑.这是因为我们通常是在成年之后才开始学代码? 很多时候,我们认为优秀 ...

最新文章

  1. 2020CCPC(长春) - Ragdoll(启发式合并+带权并查集)
  2. Visual Studio 2017 ASP.NET Core开发
  3. 74. Search a 2D Matrix
  4. 1284B. New Year and Ascent Sequence
  5. 谷歌Pixel 6系列正式发布:搭载自研Tensor SoC 规格超骁龙888
  6. JS之模板技术(aui / artTemplate)
  7. 编写iPhone应用程序有何不同
  8. FFT(不ji是干甚用的diao操作)
  9. 简述线性反馈移位寄存器
  10. vim command line操作
  11. 考试用计算机反思800字,期中考试总结反思作文800字
  12. Mac OS X 平台有哪些优秀应用可以将视频转成 GIF?Mac视频转gif软件推荐
  13. PHP图片拼接util
  14. 从键盘输入的年份,判断该年是否是闰年
  15. web4.0之万能密码登录
  16. 数据库连接池及C3P0数据库连接池技术
  17. 笔记本固态盘数据丢失怎么办?笔记本固态盘怎么恢复数据
  18. 嵌入式软件工程师—成长笔记#01
  19. 计算机教室防辐射方案,办公室电脑族如何防辐射 内调外养轻松应对
  20. 阿里发布“码上淘”平台 连接更多实体店

热门文章

  1. Django——admin
  2. 种群内禀增长率matlab求法,[数学]微分方程模型.ppt
  3. C语言窗口水平滚动条,C语言Windows程序设计滚动条
  4. 简易仿iOS辅助触控
  5. Docker的安装以及可视化图形界面的安装
  6. 某高手之C++面试经验与试题汇总
  7. activiti5、activiti6、activiti7、flowable、camunda7、camunda8流程引擎对比分析和选型参考
  8. html画布用函数旋转,canvas rotate()画布的旋转详解
  9. C# DataGridView控件清空数据完美解决方法
  10. 爬取某热搜榜,headers添加Cookie应对反爬