矩阵归零消减序列和
总时间限制: 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计算概论-矩阵归零消减序列和的更多相关文章

  1. OpenJudge计算概论-矩阵交换行

    /*======================================================================== 矩阵交换行 总时间限制: 1000ms 内存限制: ...

  2. OpenJudge计算概论-取石子游戏

    OpenJudge计算概论-取石子游戏[函数递归练习] /*====================================================================== ...

  3. Openjudge计算概论-计算矩阵边缘元素之和

    /*======================================================================== 计算矩阵边缘元素之和 总时间限制: 1000ms ...

  4. Openjudge计算概论——数组逆序重放【递归练习】

    /*===================================== 数组逆序重放 总时间限制:1000ms 内存限制:65536kB 描述 将一个数组中的值按逆序重新存放. 例如,原来的顺 ...

  5. OpenJudge计算概论-计算书费

    /*============================================== 计算书费 总时间限制: 1000ms 内存限制: 65536kB 描述 下面是一个图书的单价表: 计算 ...

  6. OpenJudge计算概论-最高的分数

    /*======================================================== 最高的分数 总时间限制: 1000ms 内存限制: 65536kB 描述 孙老师 ...

  7. Openjudge计算概论-求序列中的众数

    /*===================================== 求序列中的众数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个长度为N的整数序列 (不多于128 ...

  8. OpenJudge计算概论-找最大数序列

    /*===================================== 找最大数序列 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n行(n 不大于 30),每行不超过10 ...

  9. Openjudge计算概论-奇数单增序列

    /*===================================== 奇数单增序列 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个长度为N(不大于500)的正整数序列 ...

随机推荐

  1. java作业3

    Java字段初始化的规律: 静态初始化生成实例之后(就是new之后)变成你赋给它的值 ,先执行静态初始化,如果没有实例化,按照初始化块和构造方法在程序中出现的顺序执行. 当多个类之间有继承关系时,创建 ...

  2. WCF中DataContractAttribute 类

    一.这个类的作用 使用提供的数据协定,将类型实例序列化和反序列化为 XML 流或文档.无法继承此类,(DataContractSerializer 用于序列化和反序列化在 Windows Commun ...

  3. [转]慎用slice

    在go中,slice是对固定长度数组的一段切片,其底层是用对数值空间的指针实现的. 在slice的赋值过程中,slice的容量会被初始化成“数组长度 - slice的起点位置”,举例说明: 假设有长度 ...

  4. java抽象类与接口的区别及用法

    java抽象类与接口的区别及用法 一.抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明. 二.接口是设计的结果 :抽象类是重构的结果 . 三.java不支持多重继承,所以继承抽象类只能继承一 ...

  5. 暴力枚举——Help Me with the Game

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3394   Accepted: 2172 Description You ...

  6. 主机控制器接口(HCI)

    主机控制器接口(HCI)提供了一种访问蓝牙硬件能力的通用接口. HCI固件通过访问基带命令.链路管理器命令.硬件状态寄存器.控制寄存器以及事件寄存器实现对蓝牙硬件的HCI命令. HCI是通过包的方式来 ...

  7. 跟开涛老师学shiro -- 编码/加密

    在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储. 5.1 编码/解码 Shir ...

  8. Git简易的命令行入门教程

    简易的命令行入门教程: Git 全局设置: git config --global user.name "imsoft" git config --global user.emai ...

  9. [转载] TCP与UDP对比

    TCP和UDP区别     TCP UDP 是否连接 面向连接 面向非连接 传输可靠性 可靠的 不可靠的 应用场合 传输大量的数据 少量数据 速度 慢 快     OSI 和 TCP/IP 模型在传输 ...

  10. ZOJ 3804--解题报告

    题目相关: 3804相关链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5336 宠物(minion)在N*M的矩形玩游戏 ...