解题思路:先选出矩阵中的最大值,然后从该数为中心,找出最靠近该数的几个数中的最大值,再以该最大值为中心,重复操作,直到最后没有比中心数小的数截止。
注意事项:时间的控制
参考代码:#include<stdio.h>
#include<string.h>
int function(int *n,int k);
int main()
{
int r,c,i,j,maxloc=-1,max,count=0,tt,ii,jj;
scanf("%d %d",&r,&c);
int a[r][c];
for(i=0;i<=r-1;i++)
{
for(j=0;j<=c-1;j++)
{
scanf("%d",&a[i][j]);
if(maxloc<a[i][j])
{
maxloc=a[i][j];
ii=i;
jj=j;
}
}
}
i=ii;
j=jj;
//printf("%d %d\n",i,j);
maxloc=a[i][j];
int k,m;
int b[8],t[8],d[8];
while((r>1&&j>=0)||(r>=0&&j>1))
{
k=0;
// if(i>0&&j>0)
// {
if(i-1>=0&&j-1>=0)
{
b[k]=a[i-1][j-1];
t[k]=i-1;
d[k]=j-1;
k++;
}
if(i>=1&&j>=0)
{
b[k]=a[i-1][j];
t[k]=i-1;
d[k]=j;
k++;
}
if(i>=1&&j+1<=c-1)
{
b[k]=a[i-1][j+1];
t[k]=i-1;
d[k]=j+1;
k++;
}
if(j>=1&&i>=0)
{
b[k]=a[i][j-1];
t[k]=i;
d[k]=j-1;
k++;
}
if(j+1<=c-1&&i>=0)
{
b[k]=a[i][j+1];
t[k]=i;
d[k]=j+1;
k++;
}
if(i+1<=r-1&&j-1>=0)
{
b[k]=a[i+1][j-1];
t[k]=i+1;
d[k]=j-1;
k++;
}
if(i+1<=r-1&&j>=0)
{
b[k]=a[i+1][j];
t[k]=i+1;
d[k]=j;
k++;
}
if(i+1<=r-1&&j+1<=c-1)
{
b[k]=a[i+1][j+1];
t[k]=i+1;
d[k]=j+1;
k++;
}
//}
/* else if(i==0&&j==0)
{
printf("%d",1);
}
else
{*/
maxloc=b[0];
tt=0;
for(m=1;m<=k-1;m++)
{
if(b[m]>maxloc&&b[m]<a[i][j])
{
maxloc=b[m];
tt=m;
}
}
memset(b,0,sizeof(int));
ii=i;
jj=j;
int min=a[ii][jj];
if(min>a[t[tt]][d[tt]])
{
//printf("%d ",min);
a[i][j]=0;
count++;
i=t[tt];
j=d[tt];
}
else
if(min<=a[t[tt]][d[tt]])
{
break;
}
// }
}
if(c==1&&r==1)
printf("%d",1);
else
printf("%d",count);
return 0;
}
0.0分
0 人评分