A - Crazy Rows SPOJ - HAROWS

2024-04-11 15:18
文章标签 rows crazy spoj harows

本文主要是介绍A - Crazy Rows SPOJ - HAROWS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

You are given an N x N matrix with 0 and 1 values. You can swap any two adjacentrows of the matrix.

Your goal is to have all the 1 values in the matrix below or on the main diagonal. That is, for each X where 1 ≤ X ≤ N, there must be no 1 values in row X that are to the right of column X.

Return the minimum number of row swaps you need to achieve the goal.

Input

The first line of input gives the number of cases, TT test cases follow.
The first line of each test case has one integer, N. Each of the next N lines contains N characters. Each character is either 0 or 1.

Output

For each test case, output

Case #X: K

where X is the test case number, starting from 1, and K is the minimum number of row swaps needed to have all the 1 values in the matrix below or on the main diagonal.

You are guaranteed that there is a solution for each test case.

Limits

1 ≤ T ≤ 60

1 ≤ N ≤ 8

Input
 
Output 
 
3
2
10
11
3
001
100
010
4
1110
1100
1100
1000
Case #1: 0
Case #2: 2
Case #3: 4

题意:

 给你一个数字T,代表有T组测试数字据;

给你一个数字N,代表是一个N阶矩阵;

后面是一个N阶矩阵;

让你求出来把这个矩阵转换成一个下三角矩阵需要几步?

注意:每次的转换都是交换相邻的两行;

思路:

下三角矩阵:对角线的右上方全是0;

所以在转换之前,我们要清楚每一行的数字的最后一个数字1 在什么位置,然后根据这个位置来确定先把哪一行的位置确定下来;

我们可以由上到下的顺序来完成这个交换:先把第一行的位置确定下来,那么在后面的交换过程中我们就不需要再移动第一行了,节省步骤。那么第一行有什么特点?第一行是全0或者第一个数字是1,后面的全0;题目中保证了,一定有结果,那么我们就可以确定下来移动的顺序了,每一次都是把那一行中最后一个数字1 送在的位置最靠前的移动到最上面没有确定的位置;也就是说把a[ i] 的值小的行逐渐移动到数组的上方;

代码如下:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;const int N=110;int t,n;
char s[N][N];
int map[N][N];
int a[N];//存储每一行中的数字1存在的最后的位置;
int sum;void solve()
{sum=0;for(int i=0; i<n; i++)//第几行;{int pos=-1;for(int j=i; j<n; j++)//{if(a[j]<=i){pos=j;break;}}for(int j=pos; j>i; j--){swap(a[j],a[j-1]);//交换;sum++;}}return ;
}int main()
{scanf("%d",&t);int k=0;while(t--){k++;scanf("%d",&n);for(int i=0; i<n; i++)scanf("%s",&s[i]);memset(a,-1,sizeof a);for(int i=0; i<n; i++){for(int j=0; j<n; j++){map[i][j]=s[i][j]-'0';if(map[i][j]==1)a[i]=j;}}solve();printf("Case #%d: %d\n",k,sum);}return 0;
}

 

这篇关于A - Crazy Rows SPOJ - HAROWS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894445

相关文章

【SPOJ】1825 Free tour II 点分治

传送门:【SPOJ】1825 Free tour II 题目分析:敲了两遍。。。 本题是论文题,具体见漆子超论文《分治算法在树的路径问题中的应用》。 在以root为根的第 i 棵子树上,我们用G[ i ,j ]表示root的第 i 棵子树的路径上严格有 j 个黑点的路径的最长长度。用F[ i ,j ]表示在root为根的第 i 棵子树的路径上不超过 j 个黑点的路径的最长长度。因

【SPOJ】Triple Sums【FFT】

传送门:【SPOJ】Triple Sums 题目分析: 首先我们不考虑 i<j<k i<j<k这个条件,构造多项式: Y=∑xai \qquad\qquad\qquad Y = \sum x^{a_i} 那么 ai+aj+ak=S ai+aj+ak=S的个数即 xai+aj+ak=S x^{a_i+a_j+a_k=S}的个数,等价于 Y3中xS Y^3中x^S的系数。 然后我们考虑容斥

OpenCV学习笔记(20)关于opencv新版本中rows和cols的理解

rows:行 cols:列(column) 对于读入的一张图片SrcImage2,(图像分辨率对应为400×200像素) SrcImage2.rows=200        (行)——(有200行像素) SrcImage2.cols=400         (列)——(有400列像素) 测试程序: Mat SrcImage2;SrcImage2 = imread("400.

【SPOJ】【AGGRCOW】

总结:函数之间存在依赖。  然后一处修改了但是忘记修改另外的一处了。。。 #include <iostream>#include <cstring>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#inclu

SPOJ 1825 FTOUR2 - Free tour II (树上点分治)

题目地址:SPOJ 1825 树分治的题果然除了模板题就是金牌题啊。。。这题是一道论文题,想了好长时间。。。。终于过了,,,,注意一个坑点,如果权值全部为负的话,是可以不选任意一条边的,这样权值为0。。。也就是说初始值要设为0。。。 具体看漆子超的论文《分治算法在树的路径问题中的应用》。。 代码如下: #include <iostream>#include <string.h>#inc

SPOJ 1825 Free tour II

论文题: 在以root为根的第 i 棵子树上,我们用G[ i ,j ]表示root的第 i 棵子树的路径上严格有 j 个黑点的路径的最长长度。用F[ i ,j ]表示在root为根的第 i 棵子树的路径上不超过 j 个黑点的路径的最长长度。 因为所有子树里包含黑点数最多的路径的包含黑点数len可以O(N)求出,我们按照每棵子树的len从小到大的顺序遍历,这样就能将G和F数组降低一维,以G[ i

SPOJ - QTREE (树链剖分)

基础的树链剖分题目,不过是边权,可以向下映射成点权或者按边剖分。 VIEW CODE #include <iostream>#include<stdio.h>#include<cmath>#include<string.h>#include<algorithm>#include<string>using namespace std;const int mmax=100

SQL_CALC_FOUND_ROWS 和 FOUND_ROWS()实现对复杂sql实现分页与总条数查询

需求 ReturnResult result = new ReturnResult();try {List<Map> forList = (List<Map>) dao.findForList("Mapper.getList", map);int count = (int) dao.findForObject("Mapper.getCount", map);result.setData(for

Rows matched:1 Changed:0 Warings:0

1.结果: 出现Rows matched:1 Changed:0 Warings:0,原因是MySQL语句重复. 2.情况说明: 由于月末需要进行月结,财务逐渐需要将各个业务线数据,由线下转到线上进行系统自动做账,由于部分款项分摊数据之前是进行手工做账,在账务系统稳定之后,需要减少财务手工做账的场景,就需要进行相关款项分摊数据进行初始化,使得和K3的余额发生情况能够匹配. 3.初始化过程 (1).

spoj 227

留着 #include <cstdio>#include <cstring>#include <cstdlib>#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1const int MAXN = 200010;int pos[MAXN];int sum[MAXN << 2];// = MAXN*4int ans[