zjuoj 3780 Paint the Grid Again
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3780
Paint the Grid Again
Time Limit: 2 Seconds Memory Limit: 65536 KB
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
Author: YU, Xiaoyao
Source: The 11th Zhejiang Provincial Collegiate Programming Contest
分析;
给定n*n的矩阵
有2个操作:
1、把一行变成X
2、把一列变成O
限制:每行(每列)只能变一次
给定结果图,开始时图无O,X,问最小操作步数(且字典序最小)
思路:
对于(i,j)这个格子,若现在涂的是 O,则去掉O这排,(让这排都变成X即可)可以直接认为(i,j)是X
所以当某排的X攒满n个时,就可以去掉这排X
直接模拟即可
先把所有 全为O或全为X的 行和列预处理出来,放到一个栈里
因为字典序最小,所以先处理列再处理行,第i列 用i+n表示, 第i行用i表示
然后给栈排个序,这样就得到处理当前情况的顺序, 入个队列,然后一个个去掉就可以了。
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
#include<queue>
#include<set>
using namespace std;
#define N 1005
vector<int>ans;
char mp[N][N];
int n, h[N], l[N];
int yes[N];
int Stack[N], Top; void init(){
ans.clear();
memset(yes, , sizeof yes);
memset(h, , sizeof h);
memset(l, , sizeof l);
Top = ;
}
bool cmp(int a,int b){return a>b;}
//0-n-1 表示列 n-2n-1 表示行
void work(){
sort(Stack, Stack+Top, cmp);
queue<int>q;
int i, j;
for(int i = ; i < Top; i++){
q.push(Stack[i]), ans.push_back(Stack[i]); yes[Stack[i]]=-;
}
Top = ;
while(!q.empty()){
int u = q.front(); q.pop();
Top = ;
if(u<n)
for(j = ; j < n; j++)
{
mp[j][u] = 'X';
h[j]++;
if(yes[j+n]!=- && h[j]==n)Stack[Top++] = j+n;
}
else {
u-=n;
for(j = ; j < n; j++)
{
mp[u][j] = 'O';
l[j]++;
if(yes[j]!=- && l[j]==n)Stack[Top++] = j;
}
}
sort(Stack, Stack+Top, cmp);
for(i = ; i < Top; i++)q.push(Stack[i]), yes[Stack[i]] = -, ans.push_back(Stack[i]);
}
for(int i = ; i < *n; i++)if(yes[i]==){puts("No solution");return;}
for(int i = ans.size()-; i>=; i--){
int u = ans[i];
if(u>=n)printf("R"), u-=n;
else printf("C");
printf("%d",u+);
i ? printf(" ") : puts("");
}
}
int main(){
int T;scanf("%d",&T);
int i, j;
while(T--){
scanf("%d",&n);
init();
for(i=;i<n;i++)scanf("%s",mp[i]);
for(i=;i<n;i++)
{
for(j = ; j<n; j++)if(mp[i][j]=='X')h[i]++;
if(h[i]==n) Stack[Top++] = i+n;
else if(h[i]==) yes[i+n] = -;
}
for(i=;i<n;i++)
{
for(j = ; j<n; j++)if(mp[j][i]=='O')l[i]++;
if(l[i]==n) Stack[Top++] = i;
else if(l[i]==) yes[i] = -;
}
if(Top==){puts("No solution");continue;}
work();
}
return ;
}
/*
99
1
O
3
OOO
OOO
OOO 2
XX
OX
2
XO
OX */
zjuoj 3780 Paint the Grid Again的更多相关文章
- 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(隐式图拓扑排序)
Paint the Grid Again Time Limit: 2 Seconds Memory Limit: 65536 KB Leo has a grid with N × N cel ...
- zjuoj 3773 Paint the Grid
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3773 Paint the Grid Time Limit: 2 Secon ...
- ZOJ 3780 Paint the Grid Again
拓扑排序.2014浙江省赛题. 先看行: 如果这行没有黑色,那么这个行操作肯定不操作. 如果这行全是黑色,那么看每一列,如果列上有白色,那么这一列连一条边到这一行,代表这一列画完才画那一行 如果不全是 ...
- Paint the Grid Again ZOJ - 3780 拓扑
Paint the Grid Again Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu [ ...
- 【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 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 Reloaded ZOJ - 3781 图论变形
Paint the Grid Reloaded Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %lld & %ll ...
- 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 ...
随机推荐
- java并发编程(三)线程挂起,恢复和终止的正确方法
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17095733 下面我们给出不用上述两个方法来实现线程挂起和恢复的策略--设置标志位. ...
- python - socket - client端指定ip和端口
问题描述: 在设备中有3个NI, ip分别为192.168.1.5/6/7.其中本端192.168.1.6同对端192.168.1.10建立了一个tunnel. 我希望测试tunnel连通性, 对端起 ...
- AI PRO I 第4章
Behavior Selection Algorithms An Overview Michael Dawe, Steve Gargolinski, Luke Dicken, Troy Humphre ...
- GCC编译C代码
C程序的编译过程 常用文件的后缀名: gcc编译c代码 1.gcc 常用编译选项: 2.gcc编译方法 testc.c: #include <stdio.h> int main ...
- 如何计算合适的InnoDB的(innodb_log_file_size)日志文件大小
在mysql工具中如phpmyadmin中执行show engine innodb status;注意观察Log sequence number 60秒后再次执行 获取Log sequence num ...
- rabbitmq之消息重入队列
说起消息重入队列还得从队列注册消费者说起,客户端在向队列注册消费者之后,创建的channel也会被主队列进程monitor,当channel挂掉后,主队列进程(rabbit_amqqueue_proc ...
- 著名的sql注入问题-问题的原因分析及总结
Statement安全漏洞(sql注入问题)问题展示: 首先我的Mysql数据库中有一张users表,如下图所示 /** * 根据用户名查询用户 * @param username 需要查询的用户名 ...
- Java算法之字符串反转分析
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 在基本的工作内容开发中,算法不会显得那么重要,而在百万级别的时候,差距非常大,今天带大家研究下常见的 ...
- android必须要进行为不同分辨率设备切图
以分辨率为1920×1080的android设备为例.在项目中加载资源的位置为xxhdpi文件夹: 例如将图片放入mdpi文件夹中就会出现,图片的横纵尺寸分别乘3被的后果,因为它认为在这个文件夹中是低 ...
- WordPress基础:文章的自定义栏目的使用
写文章只有标题和内容,那么我想加个加个怎么办呢?这时候就可以用到自定义栏目了,这个功能相当于增加了一个键值对 1.启动“自定义栏目” 2.定义键值对 3.调用自定义栏目值 <?php $pric ...