OpenJudge计算概论-矩阵归零消减序列和
矩阵归零消减序列和
总时间限制: 1000ms 内存限制: 65536kB
描述
给定一个n*n的矩阵( <= n <= ,元素的值都是非负整数)。通过n-1次实施下述过程,可把这个矩阵转换成一个1*1的矩阵。每次的过程如下:
首先对矩阵进行行归零:即对每一行上的所有元素,都在其原来值的基础上减去该行上的最小值,保证相减后的值仍然是非负整数,且这一行上至少有一个元素的值为0。
接着对矩阵进行列归零:即对每一列上的所有元素,都在其原来值的基础上减去该列上的最小值,保证相减后的值仍然是非负整数,且这一列上至少有一个元素的值为0。
然后对矩阵进行消减:即把n*n矩阵的第二行和第二列删除(如果二维数组为a[][],则删除的是a[][]所在的行和列),使之转换为一个(n-)*(n-)的矩阵。
下一次过程,对生成的(n-)*(n-)矩阵实施上述过程。显然,经过n-1次上述过程, n*n的矩阵会被转换为一个1*1的矩阵。
请求出每次消减前a[][]值之和。
输入
第一行是一个整数n。
其后是n个n*n的矩阵。
每个矩阵占n行,每行有n个正整数,每个整数间用空格分隔。
输出
输出为n行,每行上的整数为对应矩阵归零消减过程中,每次消减前a[][]值之和。
样例输入 样例输出 1
提示:
请比较两种做法!
第一种做法得到的结果不正确,第二种才是正确的。![]()
其实就是说:归零时先按行归零,再按列归零。
对每一行或每一列归零时,扫描行或列,假如里面含0,那这一行或列的归零工作就免了,直接处理下一行或列。
#include<stdio.h>
int main()
{
int a[][],i,j,k,n;
int rowMin,colMin;
int x;
int sum;
freopen("5.in","r",stdin);
freopen("result.out","w",stdout);
scanf("%d",&n);
for(k=;k<n;k++)
{
//输入二维数组
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
sum=;
//归零和消减,整个操作有n-1次,每次进行时数组的阶是x
for(x=n;x>;x--)
{
//行的归零
for(i=;i<x;i++)
{
rowMin=a[i][];
for(j=;j<x&&rowMin>;j++)
{
if(a[i][j]<rowMin)
{
rowMin=a[i][j];
}
}
if(rowMin!=)
{
for(j=;j<x;j++)
{
a[i][j]=a[i][j]-rowMin;
}
} }
//列的归零
for(j=;j<x;j++)
{
colMin=a[][j];
for(i=;i<x&&colMin>;i++)
{
if(a[i][j]<colMin)
{
colMin=a[i][j];
}
}
if(colMin!=)
{
for(i=;i<x;i++)
{
a[i][j]=a[i][j]-colMin;
}
}
}
sum=sum+a[][];
//下面是消减
i=;
for(j=;j<x;j++)
a[i][j-]=a[i][j];
j=;
for(i=;i<x;i++)
a[i-][j]=a[i][j];
for(i=;i<x;i++)
{
for(j=;j<x;j++)
{
a[i-][j-]=a[i][j];
}
}
}
printf("%d\n",sum);
}
return ;
}
OpenJudge计算概论-矩阵归零消减序列和的更多相关文章
- OpenJudge计算概论-矩阵交换行
/*======================================================================== 矩阵交换行 总时间限制: 1000ms 内存限制: ...
- OpenJudge计算概论-取石子游戏
OpenJudge计算概论-取石子游戏[函数递归练习] /*====================================================================== ...
- Openjudge计算概论-计算矩阵边缘元素之和
/*======================================================================== 计算矩阵边缘元素之和 总时间限制: 1000ms ...
- Openjudge计算概论——数组逆序重放【递归练习】
/*===================================== 数组逆序重放 总时间限制:1000ms 内存限制:65536kB 描述 将一个数组中的值按逆序重新存放. 例如,原来的顺 ...
- OpenJudge计算概论-计算书费
/*============================================== 计算书费 总时间限制: 1000ms 内存限制: 65536kB 描述 下面是一个图书的单价表: 计算 ...
- OpenJudge计算概论-最高的分数
/*======================================================== 最高的分数 总时间限制: 1000ms 内存限制: 65536kB 描述 孙老师 ...
- Openjudge计算概论-求序列中的众数
/*===================================== 求序列中的众数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个长度为N的整数序列 (不多于128 ...
- OpenJudge计算概论-找最大数序列
/*===================================== 找最大数序列 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n行(n 不大于 30),每行不超过10 ...
- Openjudge计算概论-奇数单增序列
/*===================================== 奇数单增序列 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个长度为N(不大于500)的正整数序列 ...
随机推荐
- iOS 实现简单的Http 服务
http 是计算机之间通讯协议的比较简单的一种.在iPhone上,由于没有同步数据和文件共享,所以实现PC与设备之间的数据传输的最佳方式就是在程序中嵌套一个http 服务器.在这篇帖子中,我将简单的演 ...
- Fractal Tree
尝试使用递归方式实现一棵简单的分形树,给出初始点的坐标,在此基础上根据坐标轴旋转的规则计算出子树干与根节点的坐标关系,依次递归画出左子树干和右子树干,并提供一个递归的深度用于控制画的子树的数目. 在二 ...
- 算法导论----VLSI芯片测试; n个手机中过半是好的,找出哪些是好手机
对于分治(Divide and Conquer)的题目,最重要是 1.如何将原问题分解为若干个子问题, 2.子问题中是所有的都需要求解,还是选择一部分子问题即可. 还有一点其实非常关键,但是往往会被忽 ...
- 产生冠军 map 的 应用 .
开始 比赛 , 每一次的 比赛 都会有人失败 , 如果产生英雄的话 , 那就是产生 唯一一个 没有被打败的人 , 就是英雄, . #include<stdio.h> #includ ...
- cout 计算顺序问题
cout输出流的执行顺序 下面是IBM的一道笔试题 #include <iostream> using namespace std; int fun( ) { cout << ...
- 【LeetCode OJ】Evaluate Reverse Polish Notation
Problem link: http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ According to the wik ...
- Android重写getResources规避用户调整系统字体大小影响Android屏幕适配
Android屏幕适配一直是一个头疼的问题.除此之外还要考虑APP在实际应用场景中,用户千奇百怪的设置,最常见的用户设置行为就是设置手机的字体大小,比如把字体设置成超大或者超小,这对屏幕适配又带来额外 ...
- 八、CCMenu和CCMenuItem
游戏中经常会提供一些菜单项让用户开始游戏.暂停\继续游戏.打开\关闭音乐或者是返回到上一个界面,比如下面两张图中用红色线框标记的菜单项 我们可以使用CCMenu和CCMenuItem实现上述的 ...
- buildroot ntp 网络时钟同步
/********************************************************************** * buildroot ntp 网络时钟同步 * 说明: ...
- wireshark使用详解
编号:1009时间:2016年4月29日15:52:44功能:wireshark使用详解URl:http://blog.jobbole.com/70907/URL:http://www.9upk.co ...