XDOJ_309 矩阵加法运算 C语言描述

问题描述

将稀疏矩阵A的非零元以行序为主序的顺序存于一维数组V中,并用二维数组B表示A中的相应元素是否为零元素,例如:

 

 

可用          和    表示。

编程实现上述表示法的矩阵加法运算。

输入格式

首先输入两个整数n和m,为矩阵维数,然后输入两个矩阵的值B1、V1和B2、V2。

输出格式

输出矩阵运算结果B、V。

样例输入

3 4

1 0 0 1

0 1 0 0

1 0 0 0

15 22 -6 9

0 1 1 0

0 1 1 0

1 0 0 1

3 2 6 2 -5 8

样例输出

1 1 1 1

0 0 1 0

1 0 0 1

15 3 2 22 2 4 8

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define MAXLENGTH 10000
int main(){
	int i,j;
	int n,m;
	int p=0, q=0, r=0;	//做加法的下标 
	int count1 = 0;		//记录非零元个数 
	int count2 = 0;
	int tmp;
	int B1[MAXSIZE][MAXSIZE];
	int B2[MAXSIZE][MAXSIZE];
	int B[MAXSIZE][MAXSIZE] = {0};
	int V1[MAXLENGTH];
	int V2[MAXLENGTH];
	int V[MAXLENGTH] = {0};
	scanf("%d %d", &n, &m);
	//输入矩阵 
	for(i=0; i<n; i++){
		for(j=0; j<m; j++){
			scanf("%d", &tmp);
			if(tmp == 1)
				count1 ++;
			B1[i][j] = tmp;
		}
	}
	for(i=0; i<count1; i++){
		scanf("%d", &V1[i]); 
	}
	for(i=0; i<n; i++){
		for(j=0; j<m; j++){
			scanf("%d", &tmp);
			if(tmp == 1)
				count2 ++;
			B2[i][j] = tmp;
		}
	}
	for(i=0; i<count2; i++){
		scanf("%d", &V2[i]); 
	}
	//做加法
	for(i=0; i<n; i++){
		for(j=0; j<m; j++){
			if(B1[i][j] == 1 && B2[i][j] == 0){
				B[i][j] = 1;
				V[p] = V1[q];
				p++;
				q++; 
			}else if(B1[i][j] == 0 && B2[i][j] == 1){
				B[i][j] = 1;
				V[p] = V2[r];
				p++;
				r++; 
			}else if(B1[i][j] == 1 && B2[i][j] == 1){
				tmp = V1[q] + V2[r];
				q++; r++;
				if(tmp != 0){
					B[i][j] = 1;
					V[p] = tmp;
					p++; 
					
				}
			}
		}
	}
	//输出
	for(i=0; i<n; i++){
		for(j=0; j<m; j++){
			printf("%d ", B[i][j]);
		}
		printf("\n");
	} 
	i=0;
	while(1){
		if(V[i] == 0)
			break;
		printf("%d ", V[i]);
		i++;
	} 
	return 0;
} 

 


版权声明:本文为m0_46951573原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。