在一个N×N的矩阵中,如果某个元素的值大于其上下左右四个相邻元素之和,则本题称这个元素为“重点”。本题要求寻找给定矩阵中的所有“重点”。
需要注意的是:
- 矩阵中元素的坐标采用
(x,y)
的形式,x
为元素所在的行号、y
为元素所在的列号,x
和y
均从0
开始 - 矩阵的行号由上至下增长;列号从左到右增长
- 最上方一行的元素,其“上方”相邻元素,位于同列的最下方一行
- 最下方一行的元素,其“下方”相邻元素,位于同列的最上方一行
- 最左方一列的元素,其“左方”相邻元素,位于同行的最右方一列
- 最右方一列的元素,其“右方”相邻元素,位于同行的最左方一列
输入格式:
第一行给出一个不大于400
的正整数N
,
接下来N行,每行N个不超过500的正整数,用空格分隔,依次是矩阵从最上方一行开始、每行从左至右排列的N×N个元素。
输出格式:
如果矩阵中有“重点”,则在每行输出一个“重点”元素的坐标,若需要输出的元素多于一个,则按照行号从小到大、同一行中列号从小到大的顺序输出。每个坐标先输出行号、再输出列号,中间空一格。
如果矩阵中没有“重点”,则在一行中先输出None!
然后输出矩阵中所有元素之和,中间空一格。
输入样例1:
4
1 1 1 1
1 5 1 5
1 1 1 1
1 1 5 1
结尾无空行
输出样例1:
1 1
1 3
3 2
结尾无空行
输入样例2:
3
1 1 1
1 1 1
1 1 1
结尾无空行
输出样例2:
None! 9
结尾无空行
解答:
#include<stdio.h>
main(){
int n,i,j,t=0,sum=0;
scanf("%d",&n);
int a[n][n];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
int p,q,s,r;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
sum+=a[i][j];
p=i-1;
if(p<0) p=n-1;
q=i+1;
if(q==n) q=0;
r=j-1;
if(r<0) r=n-1;
s=j+1;
if(s==n) s=0;
if(a[i][j]>a[p][j]+a[q][j]+a[i][r]+a[i][s]){
if(t==0) printf("%d %d",i,j);
else printf("\n%d %d",i,j);
t++;
}
}
}
if(t==0) printf("None! %d",sum);
}