矩阵归零消减序列和

来源:互联网 发布:kmp算法next数组的含义 编辑:程序博客网 时间:2024/05/21 11:37
/* * array.cpp * *  Created on: 2014-5-22 *      Author:  *      题目 - 矩阵归零消减序列和来源//描述    给定一个n*n的矩阵(3<=n<=100,元素的值都是非负整数)。通过n-1次实施下述过程,可把这个矩阵转换成一个1*1的矩阵。每次的过程如下:    首先对矩阵进行归零:即对每一行(或一列)上的所有元素,都在其原来值的基础上减去该行(或列)上的最小值,保证相减后的值仍然是非负整数,且这一行(或列)上至少有一个元素的值为0。    然后对矩阵进行消减:即把n*n矩阵的第二行和第二列删除(如果二维数组为a[][],则删除的是a[1][1]所在的行和列),使之转换为一个(n-1)*(n-1)的矩阵。    下一次过程,对生成的(n-1)*(n-1)矩阵实施上述过程。显然,经过n-1次上述过程, n*n的矩阵会被转换为一个1*1的矩阵。    请求出每次消减前a[1][1]值之和。关于输入第一行是一个整数n。其后是n个n*n的矩阵。每个矩阵占n行,每行有n个正整数,每个整数间用空格分隔。关于输出输出为n行,每行上的整数为对应矩阵归零消减过程中,每次消减前a[1][1]值之和。例子输入31 2 32 3 43 4 51 2 35 4 29 4 51 2 35 4 29 5 4例子输出021 * */#include<iostream>using namespace std;int n,m,mymin; //n组数据,每组n*n,答案总和sumint a[110][110];//矩阵avoid delmin(int x, int y, int dx, int dy) {if (x == m || y == m) return;if (a[x][y] < mymin)  mymin = a[x][y];delmin(x + dx, y + dy, dx, dy);a[x][y] -= mymin;}void del() {int i, j;for (i = 0; i < m; i++)for (j = 1; j < m; j++)a[i][j] = a[i][j + 1];for (i = 0; i < m; i++)for (j = 1; j < m; j++)a[j][i] = a[j + 1][i];}int main() {int i, j, sum, t;for (cin >> n, t = 0; t < n; t++) {for (i=0;i<n;i++)for (j = 0; j < n; j++)cin >> a[i][j];for (sum = 0,m=n; m >= 1; m--) {for (i = 0; i < 2 * m; i++) {mymin = 10000;delmin((i%m)*(1-i/m),(i%m)*(i/m), i / m, 1 - i / m);}sum += a[1][1];del();}cout << sum << endl;}}

0 0
原创粉丝点击