【PTA】实验7-2-8 找鞍点 (20分)

ps:初学数组时几个较头疼的题目,现在重温一下

实验7-2-8 找鞍点


传送门
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:

4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

输出样例1:

2 1

输入样例2:

2
1 7
4 1

输出样例2:

NONE

解法1
以这个输入为例.
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
先遍历第一行,找到最大的7,再遍历7所在的列,7>6,不是鞍点→遍历第二行,找到行最大的8,以8所在的列遍历,8>7不是鞍点→遍历第三行…….最后找到了第三行第二列的6;
code:

#include<stdio.h>
int main()
{
    
    
	int n,a[7][7];scanf("%d",&n);
	for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&a[i][j]);
	for(int i=0;i<n;i++)
	{
    
    	
		int max_j=0,flag=0;
		for(int j=0;j<n;j++)
		if(a[i][j]>=a[i][max_j]) max_j=j;
		for(int k=0;k<n;k++)
		if(a[i][max_j]>a[k][max_j]) {
    
    flag=1;break;}
		if(!flag)	{
    
    printf("%d %d",i,max_j);   return 0;}
	}
	printf("NONE");return 0;
}

解法2
多开两个数组存每行最大和每列最小.
最后如果匹配上就输出,没匹配上就NONE;
code:

#include<stdio.h>
#include<string.h>
int a[7][7],maxx[7],minn[7];//分别存每一行最大以及每一列最小 
int main()
{
    
    
	int n;scanf("%d",&n);
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			scanf("%d",&a[i][j]);
			
	memset(minn,99, sizeof(minn));//这一步很关键(不可省略,要让初始化的minn足够大才能存入最小值) 
	
	for(int i=0;i<n;i++){
    
    
		for(int j=0;j<n;j++)
			if(maxx[i]<a[i][j])
				maxx[i]=a[i][j];//每一行的最大值
		for(int j=0;j<n;j++)
			if(minn[i]>a[j][i])
				minn[i]=a[j][i];//每一列的最小值 
	}
	for(int i=0;i<n;i++)//开始配对,如果配对成功输出并且结束
		for(int j=0;j<n;j++)
			if(minn[i]==maxx[j]){
    
     
				printf("%d %d",j,i);
				return 0;
			}
	printf("NONE");
}

判断上三角矩阵


实验7-2-5 判断上三角矩阵
code:

#include<stdio.h>
int a[11][11];
int main()
{
    
    	
	int k;scanf("%d",&k);
	while(k--)
	{
    
    
		int n;scanf("%d",&n);
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				scanf("%d",&a[i][j]);
		for(int i=1;i<n;i++)
			for(int j=0;j<i;j++)
				if(a[i][j]!=0)
				{
    
    
					printf("NO\n");
					goto end; 	
				}
		printf("YES\n");
		end:    ;//因为不想写标记,就直接使用goto了
	}
}

螺旋方阵


实验7-2-9 螺旋方阵
螺旋方阵传送门
解法借鉴大佬的舒适解答:
大佬的舒适解答

#include<stdio.h>
int main()
{
    
    
	int a[11][11],n,i,j,k,dir,x=0,y=0;
	k=1,dir=0;
	scanf("%d",&n);
	int band0=n-1,band1=n-1,band2=0,band3=1;
	while(k<=n*n)
	{
    
    
		if(0==dir)
		{
    
    
			a[x][y++]=k++;
			if(y==band1)
			{
    
    dir=1,band0--;}
		}
		else if(1==dir)
		{
    
    
			a[x++][y]=k++;
			if(x==band1)
			{
    
    dir=2,band1--;}
		}
		else if(2==dir)
		{
    
    
			a[x][y--]=k++;
			if(y==band2)
			{
    
    dir=3,band2++;}
		}
		else if(3==dir)
		{
    
    
			a[x--][y]=k++;
			if(x==band3)
			{
    
    dir=0,band3++;}
		}
	 } 
	 for(i=0;i<n;i++)
	 {
    
    
	 	for(j=0;j<n;j++)
	 		printf(" %2d",a[i][j]);
	 	printf("\n");
	 }
	
}

同类题
螺旋矩阵-PAT真题
螺旋折线
用循环的方法只能ac小数据(效率过低),一旦遇上大数据只能找规律了,我就写着玩一玩

#include<stdio.h>
struct band{
    
    
	int x,y;
}b1,b2,b3,b0;
int main()
{
    
    	
	int dir=0;//dir 0-3,0左 1上 2右,3下 
	b0.x=-1,b0.y=0;
	b1.x=-1,b1.y=1;
	b2.x=1,b2.y=1;
	b3.x=1,b3.y=-1; 
	int x=0,y=0,dis=0;
	int X,Y;//目标;
	scanf("%d%d",&X,&Y);
	while( (x!=X)||(y!=Y) )//注意这里不是 (x!=X)&&(y!=Y)
	{
    
    
		if(dir==0)
		{
    
    
			x--,dis++;
			if(x==b0.x&&y==b0.y)
			{
    
    b0.x--,b0.y--,dir=1;}
		}
		else if(dir==1)
		{
    
    
			y++,dis++;
			if(y==b1.y&&x==b1.x)
			{
    
    b1.x--,b1.y++,dir=2;}
		}
		else if(dir==2)
		{
    
    
			x++,dis++;
			if(x==b2.x&&y==b2.y)
			{
    
    b2.x++,b2.y++,dir=3;}
		}
		else if(dir==3)
		{
    
    
			y--,dis++;
			if(x==b3.x&&y==b3.y)
			{
    
    b3.y--,b3.x++,dir=0;}
		}
	} 
	printf("%d",dis);
}

猜你喜欢

转载自blog.csdn.net/weixin_49640089/article/details/112908770
今日推荐