三元组表示的矩阵求鞍点(C语言实现)

三元组表示的矩阵求鞍点(C语言实现)

普通大学生,用最笨的方法求鞍点,忽略庞大时间复杂度,纯暴力检索,代码本来是为了存储稀疏矩阵的,里面也有快速转置的算法,在此基础上,写了求鞍点的方法,虽然很笨拙,但是也写出来了,有时间复杂度低的想法欢迎大家留言呀!

转载请附上原文链接

代码如下:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define Ok 1
#define Maxsize 10 	//用户自定义三元组最大长度
typedef struct{     	//定义三元组表
	int i,j;
	int v;
}TriTupleNode;
typedef struct{  		//定义三元组表
	TriTupleNode data[Maxsize];
	int m;
	int n;
	int t;	 			//矩阵行,列及三元组表长度
}TriTupleTable;
void paixu(TriTupleTable *a);
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++;
	}
	paixu(a);
}
void  TransposeSMatrix(TriTupleTable *a, TriTupleTable *b) 
{ 
	int col,t,p,q;
	int num[100],cpot[100];
	b->data[0].i=a->data[0].j;
	b->data[0].j=a->data[0].i;
	b->data[0].v=a->data[0].v;
	b->m=a->n;
	b->n=a->m;
	b->t=a->t;
	if (b->t) {
		for (col=1;col<=a->n;col++)
			num[col] = 0;
		for (t =1;t<=a->t;++t)
			num[a->data[t].j]++;
		cpot[1] =1;
		for (col=2;col<=a->n;col++) 
			cpot[col] = cpot[col-1]+num[col-1];
		for (p=1;p<=a->t;p++) 
		{
			col=a->data[p].j;   
			q=cpot[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;  
			cpot[col]++;
		} 
	} 
	paixu(b);	
} 
void paixu(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 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 shuchu(TriTupleTable *a){
	printf("\n");
	for(int k=1;k<= a->t;k++){
		printf("%d\t%d\t%d\n",a->data[k].i,a->data[k].j,a->data[k].v);
	} 
}
void find(TriTupleTable *a)
{
	TriTupleTable *b,*c,*d;
	int q=1,t1,t2,t3,z,x;
	b=(TriTupleTable*)malloc(sizeof(TriTupleTable));
	c=(TriTupleTable*)malloc(sizeof(TriTupleTable));
	d=(TriTupleTable*)malloc(sizeof(TriTupleTable));
	c->t=0;
	d->t=0;
	c->data[q].v=999;
	for(int k=1;k<= a->t;k++){
		if(k+1>a->t) break;		
		for(;a->data[k].i == a->data[k+1].i;k++)
		{
			if(k+1>a->t) break;
			if(a->data[k].v < a->data[k+1].v){
				c->data[q].i=a->data[k].i;
				c->data[q].j=a->data[k].j;
				c->data[q].v=a->data[k].v;
				t1=a->data[k].v;
				a->data[k].v = a->data[k+1].v;
				a->data[k+1].v=t1;	
				t2=a->data[k].i;
				a->data[k].i =a->data[k+1].i;
				a->data[k+1].i=t2;	
				t3=a->data[k].j;
				a->data[k].j = a->data[k+1].j;
				a->data[k+1].j=t3;
			}
			else{
				c->data[q].i=a->data[k+1].i;
				c->data[q].j=a->data[k+1].j;
				c->data[q].v=a->data[k+1].v;
			}
		}
		q++;
		c->t++;
	}
	TransposeSMatrix(a,b);
	q=1;
	for(int k=1;k<= b->t;k++){
		if(k+1>b->t) break;		
		for(;b->data[k].i == b->data[k+1].i;k++)
		{
			if(k+1>b->t) break;
			if(b->data[k].v > b->data[k+1].v){
				d->data[q].i=b->data[k].i;
				d->data[q].j=b->data[k].j;
				d->data[q].v=b->data[k].v;
				t1=b->data[k].v;
				b->data[k].v = b->data[k+1].v;
				b->data[k+1].v=t1;	
				t2=b->data[k].i;
				b->data[k].i = b->data[k+1].i;
				b->data[k+1].i=t2;	
				t3=b->data[k].j;
				b->data[k].j = b->data[k+1].j;
				b->data[k+1].j=t3;
			}
			else{
				d->data[q].i=b->data[k+1].i;
				d->data[q].j=b->data[k+1].j;
				d->data[q].v=b->data[k+1].v;
			}
		}
		q++;
		d->t++;
	}	
	for(z=1;z<=c->t;z++)
		for(x=1;x<=c->t;x++)
			if(c->data[z].i==d->data[x].j)
				if(c->data[z].j==d->data[x].i&&c->data[z].v==d->data[x].v)	{				
					printf("鞍点的信息如下:第%d行 第%d列 值为%d",c->data[z].i,c->data[z].j,c->data[z].v); 
					goto A;
					}
A:	printf("\n");
	if(z>c->t) printf("没有找到鞍点!"); 
}
int main(){
	TriTupleTable *a,*b;
	a=(TriTupleTable*)malloc(sizeof(TriTupleTable));
	b=(TriTupleTable*)malloc(sizeof(TriTupleTable));
	InitTriTupleNode(a);
	printf("\n生成的矩阵如下:\n");
	showMatrix(a); 
	find(a);
	return 0;
}

测试数据如下:

3
3
9
1
1
1
1
2
2
1
3
5
2
1
3
2
2
4
2
3
6
3
1
5
3
2
6
3
3
7

结果如下:

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例代码,用于寻找矩阵点: ```c #include <stdio.h> #define ROWS 3 #define COLS 3 int main() { int matrix[ROWS][COLS] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int saddle_point = 0; for (int i = 0; i < ROWS; i++) { int min_row = matrix[i][0]; int min_col = 0; for (int j = 1; j < COLS; j++) { if (matrix[i][j] < min_row) { min_row = matrix[i][j]; min_col = j; } } int flag = 1; for (int k = 0; k < ROWS; k++) { if (matrix[k][min_col] > min_row) { flag = 0; break; } } if (flag) { saddle_point = min_row; printf("Saddle point found at (%d, %d): %d\n", i, min_col, saddle_point); break; } } if (!saddle_point) { printf("No saddle point found.\n"); } return 0; } ``` 在这个示例代码中,我们假设有一个名为 `matrix` 的矩阵,它包含了一些整数值。我们要在矩阵中寻找点,即在矩阵中找到一个元素,在该元素所在的行中是最小的,在该元素所在的列中是最大的。 我们使用两个循环来遍历矩阵中的每个元素。在第一个循环中,我们遍历每一行,并找到该行中的最小值。在第二个循环中,我们遍历该行中的每个元素,并找到该元素所在的列。然后,我们使用一个名为 `flag` 的标志来检查该元素是否是该列中的最大值。如果是,我们将点设置为该元素的值,并输出其坐标。如果我们在整个矩阵中找不到点,则输出一条相应的消息。 注意,这只是一个简单的示例代码,用于说明如何查找矩阵中的点。在实际应用中,可能需要考虑更多的情况和复杂性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值