ZOJ - 3780-Paint the Grid Again-(拓扑排序)
Description
Leo has a grid with N × N cells. He wants to paint each cell with a specific color (either black or white).
Leo has a magical brush which can paint any row with black color, or any column with white color. Each time he uses the brush, the previous color of cells will be covered by the new color. Since the magic of the brush is limited, each row and each column can only be painted at most once. The cells were painted in some other color (neither black nor white) initially.
Please write a program to find out the way to paint the grid.
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 an integer N (1 <= N <= 500). Then N lines follow. Each line contains a string with N characters. Each character is either 'X' (black) or 'O' (white) indicates the color of the cells should be painted to, after Leo finished his painting.
Output
For each test case, output "No solution" if it is impossible to find a way to paint the grid.
Otherwise, output the solution with minimum number of painting operations. Each operation is either "R#" (paint in a row) or "C#" (paint in a column), "#" is the index (1-based) of the row/column. Use exactly one space to separate each operation.
Among all possible solutions, you should choose the lexicographically smallest one. A solution X is lexicographically smaller than Y if there exists an integer k, the first k - 1 operations of X and Y are the same. The k-th operation of X is smaller than the k-th in Y. The operation in a column is always smaller than the operation in a row. If two operations have the same type, the one with smaller index of row/column is the lexicographically smaller one.
Sample Input
2
2
XX
OX
2
XO
OX
Sample Output
R2 C1 R1
No solution
题意:
在一张空白的图上有两个操作:
·Rx 将x行涂成黑色·Cx 将x列涂成白色
每行每列只能进行一次操作。
给定一个目标的图形,问至少需要几次操作才能达到目标图形,输出路径
分析:
一开始就想到了用图论来解决
我首先想到了如何建图:
由于每个点最多会被涂两次(R一次,C一次)。
由于R和C涂的颜色是不一样的,我们可以根据这个点的目标颜色判断出对这个点的这两次操作的先后顺序。
由此可以按先后顺序建一条边。
我们的目的就是求出一条路径满足所有这些条件(即拓扑排序)
最后题目要求字典序最小的方案,由于列变换字符'C'的字典序比行变换'R'的字典序小,因此把列号设为1~n,行号设为n+1~2n,而且要求变换的行列坐标也要最小,因此用最小堆的优先队列来代替普通队列进行拓扑排序,
另外注意一点,起点(第一个入度为0的点)是不用涂的。因为起点在后面涂的时候一定会被覆盖
比如单一个点'X',拓扑序为第1列->第1行,但是显然刷第1列这个操作是多余的。
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1030;
struct edge
{
int e;
int nxt;
edge():nxt(0){};
edge(int e2,int nxt2):e(e2),nxt(nxt2){};
}e[MAXN*MAXN];
int head[MAXN];
int tot;
int deg[MAXN];
int n;
void add(int b,int ee)
{
e[tot]=edge(ee,head[b]);
head[b]=tot++;
}
std::vector<int> res;
int non[MAXN];
bool topo()
{
priority_queue<int,vector<int>,greater<int> > q;
for(int i=1;i<=2*n;i++){ //!注意是2*n
if(deg[i]==0){
q.push(i);
//res.push_back(i);
//cout<<"push "<<i<<endl;
non[i]=1;
}
}
int t;
int now;
while(!q.empty()){
t=q.top();
q.pop();
res.push_back(t);
for(int i=head[t];i!=0;i=e[i].nxt){
now=e[i].e;
deg[now]--;
if(!deg[now]){
q.push(now);
}
}
}
//cout<<"size "<<res.size()<<endl;
return res.size()==n*2;//!注意是2*n
}
void init(){
memset(head,0,sizeof(head));
memset(deg,0,sizeof(deg));
tot=1;
res.clear();
memset(non,0,sizeof(non));
}
int main()
{
//freopen("data.in","r",stdin);
int t;
scanf("%d",&t);
char ch;
while(t--){
init();
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ch=getchar();
if(ch=='X'){
add(j,i+n);deg[i+n]++;
}
else{
add(i+n,j);deg[j]++;
}
}
getchar();
}
if(!topo()){
printf("No solution\n");
}
else{
int now=0;
int len=res.size();
for(int i=0;i<len;i++){
now=res[i];
if(non[now]) continue;
else{
printf("%c%d%c",now>n?'R':'C',now>n?now-n:now,i==len-1?'\n':' ');
}
}
//printf("\n");
}
}
}
ZOJ - 3780-Paint the Grid Again-(拓扑排序)的更多相关文章
- ZOJ 3780 Paint the Grid Again(隐式图拓扑排序)
Paint the Grid Again Time Limit: 2 Seconds Memory Limit: 65536 KB Leo has a grid with N × N cel ...
- 【ZOJ - 3780】 Paint the Grid Again (拓扑排序)
Leo has a grid with N × N cells. He wants to paint each cell with a specific color (either black or ...
- ZOJ 3780 E - Paint the Grid Again 拓扑排序
https://vjudge.net/problem/49919/origin 题意:给你n*n只出现O和X的字符阵.有两种操作,一种操作Ri将i行全变成X,一种操作Ci将i列全变成O,每个不同的操作 ...
- ZOJ 3780 - Paint the Grid Again - [模拟][第11届浙江省赛E题]
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3780 Time Limit: 2 Seconds Me ...
- ZOJ 3780 Paint the Grid Again
拓扑排序.2014浙江省赛题. 先看行: 如果这行没有黑色,那么这个行操作肯定不操作. 如果这行全是黑色,那么看每一列,如果列上有白色,那么这一列连一条边到这一行,代表这一列画完才画那一行 如果不全是 ...
- zjuoj 3780 Paint the Grid Again
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3780 Paint the Grid Again Time Limit: 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 ...
- 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 ...
- 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 ...
随机推荐
- 【pytorch】学习笔记(四)-搭建神经网络进行关系拟合
[pytorch学习笔记]-搭建神经网络进行关系拟合 学习自莫烦python 目标 1.创建一些围绕y=x^2+噪声这个函数的散点 2.用神经网络模型来建立一个可以代表他们关系的线条 建立数据集 im ...
- redis 学习(7) -- 有序集合
redis 学习(7) -- 有序集合 zset 结构 有序集合:有序.不能包含重复元素 每个节点包含:score和value两个属性,根据score进行排序 如图: zset 重要 API 含义 命 ...
- windows10升级更新1709版本 在桌面和文件夹中点击右键刷新,会引起卡顿反应慢
win10,升级更新,1709,右键,卡机,刷新,反应慢,桌面,文件夹 windows自动升级到1709版本后出现的问题,而之前是没有这种问题的. 最终解决办法:(需要设置注册表) 运行:快捷键Win ...
- 使用xpath爬取猫眼电影排行榜
最近在学习xpath,在网上找资料的时候,发现一个新手经常拿来练手的项目,爬取猫眼电影前一百名排行的信息,很多都是跟崔庆才的很雷同,基本照抄.这里就用xpath自己写了一个程序,同样也是爬取猫眼电影, ...
- scala新版本学习(3)
1.REPL:读取->求值->打印->循环.Scala程序将输入的内容快速的编译成为字节码,然后字节码文件交给Java虚拟机进行执行. 2.val是值不可变,var值可变.在变量声明 ...
- UI测试
先是从一张图开始,让大家看看这个图里有什么不妥: 接着告诉大家具体有哪些不妥: 然后结合这个找茬的过程分享下界面测试的概念和方法. 界面测试:简称UI测试,测试功能模块界面上看到的所有元素(包括空文字 ...
- leetcode240 搜索二维矩阵 II
题目: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 ma ...
- Oracle DBA 学习总结
对于学习Oracle 数据库,应该先要了解Oracle 的框架.它有物理结构(由控制文件.数据文件.重做日志文件.参数文件.归档文件.密码文件组成) ,逻辑结构(表空间.段.区.块),内存分配( SG ...
- 使用 SignalR 实现推送功能
百度搜索:使用 SignalR 实现推送功能
- 个人作业4-ALpha项目测试
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/ 这个作业要求在哪里 https://edu.cnbl ...