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");
}
#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了
}
}
#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);
}