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 ...
随机推荐
- NOIP2009多项式输出(水)【A004】
[A004]潜伏者[难度A]—————————————————————————————————————————————————————————————————————————— [题目要求] 一元 n ...
- 如何在Ubuntu 14.04服务器上自动化部署Spring Boot的应用
https://segmentfault.com/a/1190000003944843
- Python爬虫学习(5): 简单的爬取
学习了urllib,urlib2以及正则表达式之后就可以做一些简单的抓取以及处理工作.为了抓取方便,这里选择糗事百科的网页作为抓取对象. 1. 获取数据: In [293]: url = " ...
- 【Oracle】oracle中快速判断某一日期是闰年或平年
)),' then '平年' else '闰年' end as isLeapYear from dual 第一步:取日期的年初日期:第二步:年初日期增加一个月即概念2月:第三步:取概念2月的最后一天的 ...
- 2015 ACM Syrian Collegiate Programming Contest
A. My Friend of Misery 计算出答案的上下界即可. 时间复杂度$O(n)$. #include<bits/stdc++.h> using namespace std; ...
- C#中的Json的序列化和反序列化
Json是一种通用的数据格式,我们在数据交换的时候,经常会用到,下面介绍c#中的json序列化和反序列化,当然也可用在asp.net,silverlight,wpf中.我们在下面实例讲解如何进行Jso ...
- 查看IIS连接数
如果要想知道确切的当前网站IIS连接数的话,最有效的方法是通过windows自带的系统监视器来查看. 一.运行-->输入“perfmon.msc”. 二.在“系统监视器”图表区域里点击右键,然后 ...
- Node.js实现CORS跨域资源共享
什么是CORS CORS(Cross-origin resource sharing),跨域资源共享,是一份浏览器技术的规范,用来避开浏览器的同源策略 简单来说就是解决跨域问题的除了jsonp外的另一 ...
- 2016huasacm暑假集训训练四 递推_B
题目链接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/B 题意:给定n个三角形,问最多可以把区域化成多少个部分,这是一个一维空间 一定会 ...
- iOS开发之CocoaLumberjack
Cocoa LumberJack是一个功能强大的NSlog,是通用的Cocoa日志框架之一.它可以提供更高级的log功能,比如记录log至文件或网络,并可根据log的级别(info.debug.war ...