清华大学历年考研复试机试真题 - 等差数列

题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
有一个特殊的 n 行 m 列的矩阵 Aij(1≤i≤n,1≤j≤m),每个元素都是正整数,每一行和每一列都是独立的等差数列。在某一次故障中,这个矩阵的某些元素的真实值丢失了,被重置为 0。现在需要你想办法恢复这些元素,并且按照行号和列号从小到大的顺序(行号为第一关键字,列号为第二关键字,从小到大)输出能够恢复的元素。

输入输出格式
输入描述:
从标准输入读入数据。

输入的第一行包含两个正整数 n 和 m,保证 n≤10^3 和 m≤10^3。

接下来 n 行,每行 m 个整数,表示整个矩阵,保证 1≤Aij≤10^9。如果 Aij 等于 0,表示真实值丢失的元素。
输出描述:
输出若干行,表示所有能够恢复的元素。每行三个整数 i,j,x,表示 Aij 的真实值是 x。
输入输出样例
输入样例#:
复制
3 4
1 2 0 0
0 0 0 0
3 0 0 0
输出样例#:
复制
1 3 3
1 4 4
2 1 2
提示
可以恢复 3 个元素, A13 的真实值是 3,A14 的真实值是 4,A21 的真实值是 2。
题目来源
清华大学2020年机试题

新人小白 写的难看

#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f	//写成0x7fffffff就不对了
typedef struct record{
	int num;
	int sit;
}rec;
int main(){
	int n,m,i,j;
	scanf("%d %d",&n,&m);
	int a[n+1][m+1],t[n+1],p[m+1],r[n+1],c[m+1];
	rec row[n+1][2],col[m+1][2];
	memset(a,0,sizeof(a));
	memset(row,0,sizeof(row));
	memset(col,0,sizeof(col));
	memset(t,0,sizeof(t));
	memset(p,0,sizeof(p));
	memset(r,INF,sizeof(r));
	memset(c,INF,sizeof(c));
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++){
			scanf("%d",&a[i][j]);
			if(a[i][j]!=0){
				if(t[i]<2){
					row[i][t[i]].num=a[i][j];
					row[i][t[i]].sit=j;
					t[i]++;
					if(t[i]==2) r[i]=(row[i][0].num-row[i][1].num)/(row[i][0].sit-row[i][1].sit);
				}
				if(p[j]<2){
					col[j][p[j]].num=a[i][j];
					col[j][p[j]].sit=i;
					p[j]++;
					if(p[j]==2) c[j]=(col[j][0].num-col[j][1].num)/(col[j][0].sit-col[j][1].sit);
				}
			}
		}
	}
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++){
			if(a[i][j]==0){
				if(r[i]!=INF) printf("%d %d %d\n",i,j,row[i][0].num-r[i]*(row[i][0].sit-j));
				else if(c[j]!=INF) printf("%d %d %d\n",i,j,col[j][0].num-c[j]*(col[j][0].sit-i));
			}
		}
	}
	return 0;
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页