题目:

Leo has a grid with N rows and M columns. All cells are painted with either black or white initially.

Two cells A and B are called connected if they share an edge and they are in the same color, or there exists a cell C connected to both A and B.

Leo wants to paint the grid with the same color. He can make it done in multiple steps. At each step Leo can choose a cell and flip the color (from black to white or from white to black) of all cells connected to it. Leo wants to know the minimum number of steps he needs to make all cells in the same color.

Input

There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:

The first line contains two integers N and M (1 <= N, M <= 40). Then N lines follow. Each line contains a string with N characters. Each character is either 'X' (black) or 'O' (white) indicates the initial color of the cells.

Output

For each test case, output the minimum steps needed to make all cells in the same color.

Sample Input

2
2 2
OX
OX
3 3
XOX
OXO
XOX

Sample Output

1
2

Hint

For the second sample, one optimal solution is:

Step 1. flip (2, 2)

XOX
OOO
XOX

Step 2. flip (1, 2)

XXX
XXX
XXX

大意:

给定的图片有两种颜色,我们可以任选一个色块将其颜色改变,求最少几次能把图片变为纯色。

题解:

题目的数据最大是40,不算很大,大概率可暴力

首先因为图片形式的数据并不好处理,所以我们把它分为最小的影响部分,把每一个单独的色块缩成一个点,边界相邻的变成一条线,这样就吧一个图片转换成图了。

实现方法:先用bfs对每个色块涂色并编号,然后再用bfs遍历色块,转换成图。两者复杂度都很低O(n*m)

然后问题就化简为将图变为纯色的最小步骤了。

这时图中相邻的点一定是异色的,因为如果两点相邻切同色就会被归为一点。

再思考涂色的方法,对任意点转色后,相当于把该点的所有邻点变为同色,也就是说相当于把所有邻点缩为一个新点,之前被缩的点的所有边变为新点的边。假设一个点的邻点的平均值是x,新点的邻点的平均值就是x*x。根据贪心原则下一个选择转色的点也应该是新点。所以转色就变成了从某点开始图的深度。

这样题目就变成了,求图深度的最小值。

实现方法:bfs遍历各点。

AC代码:

#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
#define clear(x) {memset(x, 0, sizeof(x));}
using namespace std;
struct point {
int x, y;
};
int dx[] = { ,,,- };
int dy[] = { ,-,, };
char s[][];
int book[][];
int book2[][];
vector<int>e[];
int book3[];
int k, n, m,ma;
queue<point>q;
int bfs1(point x) {
if (book[x.x][x.y] != )return ;
while (!q.empty())q.pop();
q.push(x);
book[x.x][x.y] = k;
while (!q.empty()) {
for (int i = ; i < ; i++) {
point tmp = q.front();
tmp.x += dx[i];
tmp.y += dy[i];
if (tmp.x < || tmp.x >= n)continue;
if (tmp.y < || tmp.y >= m)continue;
if (book[tmp.x][tmp.y] == &&s[q.front().x][q.front().y]==s[tmp.x][tmp.y]) {
book[tmp.x][tmp.y] = k;
q.push(tmp);
}
}
q.pop();
}
return ;
} void bfs2(point x){
if (book2[x.x][x.y] != )return;
while (!q.empty())q.pop();
q.push(x);
book2[x.x][x.y] = ;
while (!q.empty()) {
for (int i = ; i < ; i++) {
point tmp = q.front();
tmp.x += dx[i];
tmp.y += dy[i];
if (tmp.x < || tmp.x >= n)continue;
if (tmp.y < || tmp.y >= m)continue;
if (book2[tmp.x][tmp.y] == && s[q.front().x][q.front().y] == s[tmp.x][tmp.y]) {
book2[tmp.x][tmp.y] = ;
q.push(tmp);
}
else if (s[q.front().x][q.front().y] != s[tmp.x][tmp.y]) {
e[book[q.front().x][q.front().y]].push_back(book[tmp.x][tmp.y]);
}
}
q.pop();
}
}
int bfs3(int top) {
int max = ;
clear(book3);
while (!q.empty())q.pop();
q.push({ top, });
book3[top] = ;
while (!q.empty()) {
point tmp = q.front();
if (tmp.y > max)max = tmp.y;
for (int i :e[tmp.x]) {
if (book3[i] == ) {
book3[i] = ;
q.push({ i,tmp.y + });
}
}
q.pop();
}
return max; } int main() {
int t;
cin >> t;
while (t--) { int ans = 1e9;
k = ;
cin >> n >> m;
for (int i = ; i < n; i++)
for (int j = ; j < m; j++)
cin >> s[i][j]; for (int i = ; i < n; i++)
for (int j = ; j < m; j++)
if(bfs1({ i,j }))k++; for (int i = ; i < n; i++)
for (int j = ; j < m; j++)
bfs2({ i,j }); for (int i = ; i < k; i++) {
int tmp = bfs3(i);
if (tmp < ans)ans = tmp;
} cout << ans << '\n'; clear(book);
clear(book2);
clear(e);
} }
 

【最短路+bfs+缩点】Paint the Grid Reloaded ZOJ - 3781的更多相关文章

  1. Paint the Grid Reloaded ZOJ - 3781 图论变形

    Paint the Grid Reloaded Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %ll ...

  2. ZOJ 3781 Paint the Grid Reloaded(BFS+缩点思想)

    Paint the Grid Reloaded Time Limit: 2 Seconds      Memory Limit: 65536 KB Leo has a grid with N rows ...

  3. ZOJ 3781 - Paint the Grid Reloaded - [DFS连通块缩点建图+BFS求深度][第11届浙江省赛F题]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3781 Time Limit: 2 Seconds      Me ...

  4. Paint the Grid Reloaded(缩点,DFS+BFS)

    Leo has a grid with N rows and M columns. All cells are painted with either black or white initially ...

  5. 2014 Super Training #4 E Paint the Grid Reloaded --联通块缩点+BFS

    原题: ZOJ 3781 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3781 题意: 给一个n*m的X,O构成的格子,对 ...

  6. ZOJ 3781 Paint the Grid Reloaded(BFS)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3781 Leo has a grid with N rows an ...

  7. Paint the Grid Again ZOJ - 3780 拓扑

    Paint the Grid Again Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu [ ...

  8. ZOJ 3781 Paint the Grid Reloaded(DFS连通块缩点+BFS求最短路)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5268 题目大意:字符一样并且相邻的即为连通.每次可翻转一个连通块X( ...

  9. [ZOJ3781]Paint the Grid Reloaded

    思路: 先用DFS缩点,然后BFS找出每个点出发能到达的最长路,取$min$. 注意多组数据,初始化一定要仔细,刚开始存边的$e$忘记初始化,一直WA,调了半个晚上. 一开始和网上的题解对拍$T=1$ ...

随机推荐

  1. JavaScript图形实例:图形放大镜效果

    1. 基本四瓣花型图案 根据四瓣花卉线的参数方程: t= r*(1+sin(12*θ)/5)*(0.5+sin(4*θ)/2); x=t*cos(θ)); y=t*sin(θ)); 编写如下的HTML ...

  2. git和github入门指南(6)

    6.交作业的流程 以下内容是螺钉课堂在线就业班提交作业的要求,非螺钉课堂在线就业班学员不用学习 螺钉课堂作业全程采用git管理,希望在日常使用中,加深对git和github的理解 具体流程: 1.注册 ...

  3. js基础练习题(4)

    9.对象 阅读代码,回答问题 function User(name) { var name1 = name; this.name2 = name; function getName1() { retu ...

  4. js语法基础入门(1)

    1.基础入门 1.1.hello world 1.1.1.JavaScript是什么? JavaScript是一门跨平台.面向对象的轻量级脚本语言,在web开发中被广泛应用 1.1.2.JavaScr ...

  5. Lists.newArrayList() 和 new ArrayList()的区别?

    什么是创建List字符串的最好构造方法?是Lists.newArrayList()还是new ArrayList()? 还是个人喜好? Lists和Maps是两个工具类, Lists.newArray ...

  6. CSS3动画 相比JS Animation 哪个更快?

    CSS vs. JS Animation: 哪个更快? 基于JavaScript的动画竟然已经默默地比CSS的transition动画快了?而且,Adobe和 Google竟然一直在发布可以媲美原生应 ...

  7. 【线型DP】洛谷P2066 机器分配

    [线型DP]洛谷P2066 机器分配 标签(空格分隔): 线型DP [题目] 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配 ...

  8. 干货分享丨jvm系列:dump文件深度分析

    摘要:java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因.那么dump文件的内容是什么样的呢? JVM ...

  9. Jetbranis学习资料之全家桶

    相信很多小伙伴,用的代码编辑器很多都是Jetbrains的,但好东西不可能免费的,而且找了很多激活码都是失效总是莫名其妙的就过期了.下面分享一个不错的激活码地址,比其他的应该更加可靠.本人实测目前支持 ...

  10. linux专题(三):常用的基本命令(一)目录管理

    http://dwz.date/UDf 绝对路径和相对路径 我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /. 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们. 在开始 ...