二维数组与指针求鞍点

本文记录了一位程序员在解决寻找二维数组鞍点问题时遇到的思维方式挑战。作者首先介绍了传统的行中最大、列中最小的搜索方式,然后详细描述了自己如何克服惯性思维,实现先找列中最小再找行中最大的算法。最终,作者成功编写出代码并分享了简化版的实现,没有使用强制类型转换,简化了老师的原始方法。
摘要由CSDN通过智能技术生成

写在前面

前几日老师展示了如何用纯指针找一个二维数组的鞍点(行中最大,列中最小),老师按照常人的思维——先找行中最大再找列中最小。自我认为这种思维比较好理解。课后,老师又布置了一个作业——先找列中最小,再找行中最大。哈哈,起初我是觉得应该差不多的也确确实实差不多,但是实现起来就有一种思维被禁锢(惯性思维)的感觉,难以下手。写了几次都因为思绪突然断线,然后得缓好一会儿。

于是今天我又打开了电脑,重新开始琢磨;同样的我也在纸上写着画着。

功夫不负有心人,写出来了!!
老师在某个地方用了强制类型转换,而我没用,并且我也觉得他写的挺复杂的哈哈哈哈~~

先看看代码:

#include <stdio.h>
int main()
{
	int a[3][4]={5,6,7,8,1,2,3,4,9,10,11,12};
	int (*p)[4],(*k)[4],*max,*q,*m;
	for(q=*a;q<*a+4;q++)//先找列中最小,再找行中最大 
	{
		max=q;
		for(p=a,k=p;p<a+3;p++)
			if(*(*p+(q-*a))<*max) {max=(*p+(q-*a));k=p;}//找到一列中最小的值		
		for(m=*k;m<*k+4;m++)
			if(*(*k+(m-*k))>*max) break;
		if(m>=*k+4) printf("找到鞍点!\na[%d][%d]=%d",k-a,q-*a,*max);
	}
	return 0;
}

变量定了挺多的,没办法我很菜。

再看看之前测试的代码(就是输出了地址以寻找错误)

#include <stdio.h>
int main()
{
	int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
	int (*p)[4],(*k)[4],*max,*q,*m;
	for(q=*a;q<*a+4;q++)
	{
		max=q;
		for(p=a,k=p;p<a+3;p++)
		{
			if(*(*p+(q-*a))<*max) {max=(*p+(q-*a));k=p;}//找到一列中最小的值
			//printf("p的地址%d,a[%d][%d]的地址%d\n",k,p-a,q-*a,*p+(q-*a));			
		}
		//printf("\n");
		for(m=*k;m<*k+4;m++)
		{
			//printf("m的地址%d\n",m);
			//printf("m-*k的值%d\n",m-*k);
			if(*(*k+(m-*k))>*max) break;
			
		}
		if(m>=*k+4) printf("找到鞍点!\na[%d][%d]=%d",k-a,q-*a,*max);
	}

	return 0;
}

嗯好的,就这样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值