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)的正整数序列 ...
随机推荐
- 实现:TextView自由复制功能
源代码已经上传,链接地址:http://download.csdn.net/detail/huangyabin001/7556825 点击打开链接 package com.example.copyfr ...
- BZOJ 3450 Easy
注意细节啊... 和上一道差不多. #include<iostream> #include<cstdio> #include<cstring> #include&l ...
- Bootstrap全局css
HTML中的所有标题标签,<h1>到<h6>均可使用.另外,还提供了.h1到.h6类,为的是给内联(inline)属性的文本赋予标题的样式.在标题内还可以包含<small ...
- Monogb基本概念及基本操作
MongoDB是面向文档的数据库. 索引:MongoDB支持通用辅助索引,能进行多种快速查询,也提供唯一的.复合的和地理空间索引能力. 存储JavaScript:开发人员不必使用存储过程了,可以直接在 ...
- iOS开发:icon和启动图尺寸
歪果仁的总结: Asset iPhone 6s Plus and iPhone 6 Plus (@3x) iPhone 6s, iPhone 6, and iPhone 5 (@2x) iPhone ...
- HDU 4004
http://acm.hdu.edu.cn/showproblem.php?pid=4004 题意:青蛙过长L的河,只能落在石头上,石头数量是n,给出n个坐标,至多跳m次,求在可以过河的条件下,青蛙跳 ...
- C#静态类和静态成员
1. 静态类 1.1 简介 静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数. 静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化. ...
- Magento创建configurable产品的要点
接着上一篇用API创建可配置的产品Configurable Product说事.Magento的产品类型可分为Simple Product.Group Product.Configurable Pro ...
- 编程之美2.5:寻找最大的K个数
编程之美2.5:寻找最大的K个数 引申:寻找第k大的数: 方法一: // 选择第k大的数(通过改进快速排序来实现) public static void SelectShort(int[] array ...
- JavaScript数据结构——数组
参考书籍:<学习JavaScript数据结构与算法>