1. 程式人生 > 其它 >基於三元組表儲存稀疏矩陣求鞍點(C語言版)

基於三元組表儲存稀疏矩陣求鞍點(C語言版)

技術標籤:資料結構矩陣資料結構c語言

基於三元組表儲存稀疏矩陣求鞍點(C語言版)

資料結構課

#include<stdio.h>
#include<stdlib.h>
#define Maxsize 10
typedef struct{     	//定義三元組表
	int i,j;
	int v;
}TriTupleNode;
typedef struct{  		//定義三元組表
	TriTupleNode data[Maxsize];
	int m;
	int n;
	int t;	 			//矩陣行,列及三元組表長度
}TriTupleTable;

int flag;
// 普通二維矩陣實現 void easy_way() { int m,n; printf("請輸入行列 例如:3 3\n"); scanf("%d %d",&m,&n); int arr[m][n]; int b[n]; int i,j,k; //輸入 printf("請輸入%d個數:\n",m*n); for(i=0;i<m;i++) { for(j=0;j<n;j++) { scanf("%d",&arr[i][j]); } } //輸出
printf("\n-----------------------\n"); printf("\n輸入的二維矩陣為:\n"); for(i=0;i<m;i++) { for(j=0;j<n;j++) { printf("%d ",arr[i][j]); } printf("\n"); } printf("\n-----------------------\n"); int s,count=0; // int min,max; for(j=0;j<
m;j++) { min = arr[j][0]; for(i=0;i<n;i++) { if(arr[j][i] < min) { min = arr[j][i]; } } //找出這行最小值 s=0; for(i=0;i<n;i++) { if(arr[j][i] == min) { b[s] =i; s++; } } //找出這行有幾個最小值 // printf("min:%d\n",min); max = min; for(i=0;i<s;i++) { for(k=0;k<m;k++) { if(max < arr[k][b[i]]) { break; } if(k==m-1) { printf("\n陣列[%d][%d]為鞍點值為: %d\n",j,b[i],arr[j][b[i]]); count++; } } } } if(count == 0) { printf("無\n"); } } // sort //防止使用者亂序輸入 void Tuplesort(TriTupleTable *a){ int z,x,temp1,temp2,temp3; for(z=0;z<a->t;z++) for(x=1;x<a->t-z;x++) { if(a->data[x].i==a->data[x+1].i){ if(a->data[x].j>a->data[x+1].j){ temp1=a->data[x].i; temp2=a->data[x].j; temp3=a->data[x].v; a->data[x].i=a->data[x+1].i; a->data[x].j=a->data[x+1].j; a->data[x].v=a->data[x+1].v; a->data[x+1].i=temp1; a->data[x+1].j=temp2; a->data[x+1].v=temp3; } } if(a->data[x].i>a->data[x+1].i){ temp1=a->data[x].i; temp2=a->data[x].j; temp3=a->data[x].v; a->data[x].i=a->data[x+1].i; a->data[x].j=a->data[x+1].j; a->data[x].v=a->data[x+1].v; a->data[x+1].i=temp1; a->data[x+1].j=temp2; a->data[x+1].v=temp3; } } } // 初始化 百度的輸入方式(健壯性較好) void InitTriTupleNode (TriTupleTable *a){ int i,j,k,val; i=j=0; k=1; printf("請輸入矩陣最大行數: "); scanf("%d",&a->data[0].i); printf("請輸入矩陣最大列數: "); scanf("%d",&a->data[0].j); printf("請輸入矩陣有效數字的個數: "); scanf("%d",&a->data[0].v); a->m =a->data[0].i; a->n =a->data[0].j; a->t =a->data[0].v; while(k<=a->t&&i!=-1&&j!=-1){ //rol=-1||col=-1結束輸入 Q: printf("輸入矩陣元素的行: "); scanf("%d",&i); if(i>a->m){ printf("輸入錯誤,請重新輸入!\n"); goto Q; //健壯性 } else if(i==-1) break; W: printf("輸入矩陣元素的列: "); scanf("%d",&j); if(j>a->n){ printf("輸入錯誤,請重新輸入!\n"); goto W; //健壯性 } else if(i==-1) break; printf("輸入矩陣元素的值: "); scanf("%d",&val); a->data[k].i=i; a->data[k].j=j; a->data[k].v=val; k++; } Tuplesort(a); //防止使用者亂序輸入 } void showMatrix(TriTupleTable *a){ //輸出稀疏矩陣 int p,q; int t=1; for(p=1;p<=a->m;p++){ for(q=1;q<=a->n;q++){ if(a->data[t].i==p&&a->data[t].j==q){ printf("%d\t",a->data[t].v); t++; } else printf("0\t"); } printf("\n"); } } //普通轉置 void TransposeSMatrix(TriTupleTable *a,TriTupleTable *b){ int q,col,p; b->m=a->n; b->n=a->m; b->t=a->t; b->data[0].i = a->n; b->data[0].j = a->m; b->data[0].v = a->t; if(b->t){ q=1; for(col=1;col<=a->n;++col) for(p=1;p<=a->t;++p) if(a->data[p].j==col){ b->data[q].i=a->data[p].j; b->data[q].j=a->data[p].i; b->data[q].v=a->data[p].v; ++q; } } } void isAD(TriTupleTable *a,int x,int min) { TriTupleTable *b; b=(TriTupleTable*)malloc(sizeof(TriTupleTable)); TransposeSMatrix(a,b); //此時的b已經轉置好了 // printf("b:\n"); // showMatrix(b); int t=1; int index_x=0,index_y=0; int tem=0; // 同理先找到第一個值 for(t = 1; t<=a->t; t++) { if (b->data[t].i == x) { index_x = b->data[t].i; index_y = b->data[t].j; tem = b->data[t].v; break; } else { index_x = 0; index_y = 0; tem = 0; } } for(t = 1; t<=a->t; t++) { if (b->data[t].i == x) { if(tem < b->data[t].v) { index_x = b->data[t].i; index_y = b->data[t].j; tem = b->data[t].v; } } } // printf("\n(%d,%d)值為:%d\n",index_x,index_y,tem); if((index_x == x)&&(min == tem)&&(x!=0)) { printf("\n第(%d,%d)為鞍點值為:%d\n",index_y,index_x,tem); flag = 1; } } void find(TriTupleTable *a) { int p,q; int t=1; int index=1; int minlist[a->m]; int index_x=0,index_y=0; int tem=0; p=1; for (p=1;p<=a->data[0].j;p++) { //先找到 第一行第一個值 for(t = 1; t<=a->t; t++) { if (a->data[t].i == p) { index_x = a->data[t].i; index_y = a->data[t].j; tem = a->data[t].v; break; } else { index_x = 0; index_y = 0; tem = 0; } } // printf("\n第一個數:%d,%d,%d\n",index_x,index_y,tem); for(t = 1; t<=a->t; t++) { if (a->data[t].i == p) { if(tem > a->data[t].v) { index_x = a->data[t].i; index_y = a->data[t].j; tem = a->data[t].v; } } } // printf("\n第%d行最小的數:(%d,%d)值為:%d\n",p,index_x,index_y,tem); // 將最小的這個數的 縱座標 index_y 傳給 轉置矩陣 當作橫座標去找該行最大值 若找到了 這個 index_k // 並且等於 index_x 則返回說這個是鞍點 isAD(a,index_y,tem); } if(flag != 1) { printf("沒有鞍點!!\n"); } } int main() { // 二維陣列直接操作 // easy_way(); TriTupleTable *a; a=(TriTupleTable*)malloc(sizeof(TriTupleTable)); InitTriTupleNode(a); showMatrix(a); printf("\n"); find(a); return 0; }

忙碌了一下午的萬師傅終於關掉了程式(暴力真香)
在這裡插入圖片描述

測試用例1:
請輸入矩陣最大行數: 4
請輸入矩陣最大列數: 4
請輸入矩陣有效數字的個數: 7
輸入矩陣元素的行: 2
輸入矩陣元素的列: 2
輸入矩陣元素的值: 2
輸入矩陣元素的行: 2
輸入矩陣元素的列: 3
輸入矩陣元素的值: 7
輸入矩陣元素的行: 3
輸入矩陣元素的列: 1
輸入矩陣元素的值: 4
輸入矩陣元素的行: 3
輸入矩陣元素的列: 2
輸入矩陣元素的值: 3
輸入矩陣元素的行: 3
輸入矩陣元素的列: 3
輸入矩陣元素的值: 2
輸入矩陣元素的行: 3
輸入矩陣元素的列: 4
輸入矩陣元素的值: 1
輸入矩陣元素的行: 4
輸入矩陣元素的列: 2
輸入矩陣元素的值: 1
示例1輸出

0 0 0 0
0 2 7 0
4 3 2 1
0 1 0 0

第(3,4)為鞍點值為:1

暴力查詢,相關結構參考