|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
梦想星际舰队第25关 && FCOI #9 题解
第六题:涂色游戏
题目描述
涂色游戏的游戏界面是一个 n 行 m 列的网格图,起初每一个格子都是颜色 "0"(颜色用数字代替,这里只有 0,1)。
每一次操作你都可以选择如下的任意一种:
1. 选择一行,把这一行涂成颜色“1”;
2. 选择一列,把这一列涂成颜色“0”;
这里的涂色都会覆盖原有的颜色。
请问如何操作才能把网格变成最终想要的状态(状态会通过数组形式给你)?
输入格式
第一行两个整数 n,m。
接下来 n 行,每行 m 个整数,第 i 行 j 列的整数表示 i 行 j 列需要涂成的颜色,只有 0 和 1 这两个数字。
输出格式
第一行一个整数,表示你需要操作的次数。
接下来,每一次的操作,你都要详细地指明,是哪一个操作(1或2,上有指明),操作了哪一行(列),第 i+1 行表示第 i 次操作。
例如下面就是先将第 2 行染成颜色 1,再将第 3 列染成颜色 0,最后将第 1 行染成颜色 1 的一个输出示例:
你输出的第一个数字必须是 1 或 2,第二个数字不得超过行或列的实际范围,否则会视为 0 分。
如果无解,输出一行 -1。
输入输出样例
输入 #1
输出 #1
输入 #2
- 4 4
- 0 1 1 1
- 0 1 0 0
- 0 1 1 1
- 0 1 0 0
复制代码
输出 #2
- 8
- 2 2
- 1 2
- 1 4
- 2 3
- 2 4
- 1 1
- 1 3
- 2 1
复制代码
数据范围
1≤x1<x2≤10^9 ,1≤y1<y2≤10^9
其他说明
本题目为 zhangjinxuan 原创题目。
测试链接:https://www.luogu.com.cn/problem/U330607
答案与解析
[/hide]
诶嘿嘿,硬是用STL(没用任何算法)搞出来了
- #include <cstdio>
- #include <algorithm>
- #include <set>
- using namespace std;
- //膜拜[url=home.php?mod=space&uid=1292144]@zhangjinxuan[/url] dalao %%%orz
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- //我这个蒟蒻被zhangjinxuan,mushezi,yuanhao,sfqxx薄纱啦!!!
- //FCOI please do not ak me!!!
- //谢谢zhangjinxuan大佬提供特殊约定~
- typedef struct{
- int row;
- int count;
- }hh; //统计各行的0的数目
- inline bool cmp(hh a,hh b)
- {
- return a.count<b.count;
- }
- inline void out_row(bool *sz,int col_max)
- {
- for(int i=0;i<col_max;i++)
- {
- printf("%d.",sz[i]);
- }
-
- }
- int main()
- {
- set<int>rows;
- int n,m,cnt,ch,stepcnt=0;
- hh rs[2010];
- bool sz[2010][2010];
- scanf("%d%d",&n,&m);
- getchar();
- for(int i=0;i<n;i++)//hang
- {
- cnt=0;
- for(int j=0;j<m;j++)//lie
- {
- ch=getchar();
- //printf("%d.",ch);
- if(ch=='0')
- {
- sz[i][j]=false;
-
- }
- else
- {
- sz[i][j]=true;
- cnt++;
- }
- getchar();
- }
- getchar();
- rs[i].count=cnt;
- rs[i].row=i;
- stepcnt+=m-cnt;
- }
- sort(rs,rs+n,cmp);
- /*for(int k=0;k<n;k++)
- {
- out_row(sz[rs[k].row],m);
- putchar('\n');
- }*/
- stepcnt+=n;
- for(int i=0;i<n;i++)
- {
- int r=rs[i].row;
- for(int j=0;j<m;j++)
- {
- if(!sz[r][j])
- {
- if(rows.count(j)==0 and i!=0)
- {
- printf("-1\n");
- return 0;
- }
- if(i==0)rows.insert(j);
- }
- }
- }
- printf("%d\n",stepcnt);
-
- for(int i=0;i<n;i++)
- {
- int r=rs[i].row;
- printf("1 %d\n",r+1);
- for(int j=0;j<m;j++)
- {
- if(!sz[r][j])
- {
- printf("2 %d\n",j+1);
-
- }
- }
- }
-
- }
复制代码
一个排序,排出每行的'0'的个数
然后用set看是否真包含。
|
|