【最短路+bfs+缩点】Paint the Grid Reloaded ZOJ - 3781
题目:
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的更多相关文章
- Paint the Grid Reloaded ZOJ - 3781 图论变形
Paint the Grid Reloaded Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %lld & %ll ...
- 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 ...
- 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 ...
- 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 ...
- 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构成的格子,对 ...
- 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 ...
- Paint the Grid Again ZOJ - 3780 拓扑
Paint the Grid Again Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu [ ...
- ZOJ 3781 Paint the Grid Reloaded(DFS连通块缩点+BFS求最短路)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5268 题目大意:字符一样并且相邻的即为连通.每次可翻转一个连通块X( ...
- [ZOJ3781]Paint the Grid Reloaded
思路: 先用DFS缩点,然后BFS找出每个点出发能到达的最长路,取$min$. 注意多组数据,初始化一定要仔细,刚开始存边的$e$忘记初始化,一直WA,调了半个晚上. 一开始和网上的题解对拍$T=1$ ...
随机推荐
- Jmeter系列(26)- 详解 JSON 提取器
果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 为什么要用 JSON 提取器 JSON ...
- 【漏洞三】跨站点脚本(XSS)攻击
[漏洞] 跨站点脚本(XSS)攻击 [原因] 跨站点脚本(也称为xss)是一个漏洞,攻击者可以发送恶意代码(通常在(Javascript的形式)给另一个用户.因为浏览器无法知道脚本是否值得信任,所以它 ...
- Redis持久性——RDB和AOF
Redis持久性 Redis提供了不同的持久性选项: RDB持久性以指定的时间间隔执行数据集的时间点快照. AOF持久性记录服务器接收的每个写入操作,将在服务器启动时再次播放,重建原始数据集.使用与R ...
- Hystrix总结
Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复. Hystrix能做什么? ...
- 03.基于测试开发讲解和Cobertura框架介绍
首先我们先 CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(200) DEFAULT ...
- java scoket Blocking 阻塞IO socket通信二
在上面一节中,服务端收到客户端的连接之后,都是new一个新的线程来处理客户端发送的请求,每次new 一个线程比较耗费系统资源,如果100万个客户端,我们就要创建100万个线程,相当的 耗费系统的资源, ...
- React实战教程之从零开始手把手教你使用 React 最新特性Hooks API 打造一款计算机知识测验App
项目演示地址 项目演示地址 项目代码结构 前言 React 框架的优雅不言而喻,组件化的编程思想使得React框架开发的项目代码简洁,易懂,但早期 React 类组件的写法略显繁琐.React Hoo ...
- TCP端口扫描类型-隐蔽扫描和僵尸扫描
TCP扫描有三种类型:全连接扫描,隐蔽扫描,僵尸扫描.全连接扫描无须赘述. 隐蔽扫描:发送完SYN数据包以及收到SYN/ACK数据包后不再发送SCK数据包,由于没有建立完整的TCP连接,所以在目标主机 ...
- .net core 使用 swagger 生成接口文档
微软参考文档:https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-help-pages-using-swagger?tabs= ...
- MySQL 索引结构 hash 有序数组
MySQL 索引结构 hash 有序数组 除了最常见的树形索引结构,Hash索引也有它的独到之处. Hash算法 Hash本身是一种函数,又被称为散列函数. 它的思路很简单:将key放在数组里,用 ...