5-8 找鞍点 (20分)
代码:
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的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:
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int num[7][7]={0};
int max[6]={0};
int min[6]={9,9,9,9,9,9};
int pos[6]={0};
int i,j;
for(i=0;i<7;i++){
for(j=0;j<7;j++){
num[i][j]=0;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&num[i][j]);
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(num[i][j]>max[i]){
max[i]=num[i][j];
}
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(num[j][i]<min[i]){
min[i]=num[j][i];
}}}
int flag=0;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if((num[i][j]==max[i])&&(num[i][j]==min[j])){
printf("%d %d",i,j);
flag=1;
break;
}
}
if(flag==1){
break;
}
}
if(!flag){
printf("NONE");
}
return 0;
}
代码2:
int main(){
int n;
scanf("%d",&n);
int num[7][7]={0};
int max[6]={0};
int min[6]={9,9,9,9,9,9};
int pos[6]={0};
int i,j;
for(i=0;i<7;i++){
for(j=0;j<7;j++){
num[i][j]=0;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&num[i][j]);
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(num[i][j]>max[i]){
max[i]=num[i][j];
}
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(num[j][i]<min[i]){
min[i]=num[j][i];
}}}
int flag=0;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if((num[i][j]==max[i])&&(num[i][j]==min[j])){
printf("%d %d",i,j);
flag=1;
break;
}
}
if(flag==1){
break;
}
}
if(!flag){
printf("NONE");
}
return 0;
}
代码2:
#include<stdio.h>
int main(){
int matrix[8][8];
int i,j,k,n,f;
int min,max;
for (i=0;i<8;i++)
for (j=0;j<8;j++)
matrix[i][j]=0;
scanf("%d",&n);
for (i=0;i<n;i++)
for (j=0;j<n;j++)
scanf("%d",&matrix[i][j]);
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (matrix[i][n] < matrix[i][j])
matrix[i][n] = matrix[i][j];
for (j=0;j<n;j++){
matrix[n][j] = matrix[0][j];
for (i=0;i<n;i++)
if (matrix[n][j] > matrix[i][j])
matrix[n][j] = matrix[i][j];
}
f=0;
for (i=0;i<n;i++){
for (j=0;j<n;j++){
if (matrix[i][j] == matrix[n][j] && matrix[i][j] == matrix[i][n]){
f=1;
break;
}
}
if (f ==1)break;
}
if (f ==1){
printf("%d %d",i,j);
}else{
printf("NONE");
}
return 0;
}
5-7
所谓“螺旋方阵”,是指对任意给定的NNN,将1到N×NN\times NN×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×NN\times NN×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数NNN(<10<10<10)。
输出格式:
输出N×NN\times NN×N的螺旋方阵。每行NNN个数字,每个数字占3位。
输入样例:
5
输出样例:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
#include<stdio.h>
#include<string.h>
int main()
{
int N,a[20][20]={0},i=1,j=1,k=1;
scanf("%d",&N);
while(k<=N*N)
{
while(j<=N)
{
if(!a[i][j])
a[i][j++]=k++;
else
break;
}
j--;
i++;
while(i<=N)
{
if(!a[i][j])
a[i++][j]=k++;
else
break;
}
i--;
j--;
while(j>0)
{
if(!a[i][j])
a[i][j--]=k++;
else
break;
}
j++;
i--;
while(i>0)
{
if(!a[i][j])
a[i--][j]=k++;
else
break;
}
i++;
j++;
}
for(i=1;i<=N;i++)
{
for(j=1;j<N;j++)
printf("%3d",a[i][j]);
printf("%3d\n",a[i][j]);
}
return 0;
}
#include<string.h>
int main()
{
int N,a[20][20]={0},i=1,j=1,k=1;
scanf("%d",&N);
while(k<=N*N)
{
while(j<=N)
{
if(!a[i][j])
a[i][j++]=k++;
else
break;
}
j--;
i++;
while(i<=N)
{
if(!a[i][j])
a[i++][j]=k++;
else
break;
}
i--;
j--;
while(j>0)
{
if(!a[i][j])
a[i][j--]=k++;
else
break;
}
j++;
i--;
while(i>0)
{
if(!a[i][j])
a[i--][j]=k++;
else
break;
}
i++;
j++;
}
for(i=1;i<=N;i++)
{
for(j=1;j<N;j++)
printf("%3d",a[i][j]);
printf("%3d\n",a[i][j]);
}
return 0;
}
5-6 求矩阵的局部极大值 (15分)
#include<stdio.h>
int main(){
int m,n;
scanf("%d %d",&m,&n);
int num[m][n];
int i,j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&num[i][j]);
}
}
int cou=0;
for(i=1;i<m-1;i++){
for(j=1;j<n-1;j++){
if((num[i][j]>num[i][j-1])&&(num[i][j]>num[i][j+1])&&(num[i][j]>num[i-1][j]&&num[i][j]>num[i+1][j])){
printf("%d %d %d\n",num[i][j],i+1,j+1);
cou++;
}
}
}
if(cou==0){
printf("None %d %d",m,n);
}
return 0;
}
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。
输入格式:
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。
输出格式:
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。
输入样例1:
4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1
输出样例1:
9 2 3
5 3 2
5 3 4
输入样例2:
3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1
输出样例2:
None 3 5
int main(){
int m,n;
scanf("%d %d",&m,&n);
int num[m][n];
int i,j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&num[i][j]);
}
}
int cou=0;
for(i=1;i<m-1;i++){
for(j=1;j<n-1;j++){
if((num[i][j]>num[i][j-1])&&(num[i][j]>num[i][j+1])&&(num[i][j]>num[i-1][j]&&num[i][j]>num[i+1][j])){
printf("%d %d %d\n",num[i][j],i+1,j+1);
cou++;
}
}
}
if(cou==0){
printf("None %d %d",m,n);
}
return 0;
}