分治算法-距阵中的数字

(矩阵中的数字)有一个 n×n(1≤n≤5000) 的矩阵 a,对于 1≤i<n,1≤j≤n,a[i][j]​<a[i+1][j]​,a[i][j]​<a[i][j+1]。
即矩阵中左右相邻的两个元素,右边的元素一定比左边的大。上下相邻的两个元素,下面的元素一定比上面的大。
给定矩阵 a 中的一个数字 k,找出k 所在的行列(注意:输入数据保证矩阵中的数各不相同)。(2008年提高组真题)


代码实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;
int n,k,answerx,answery;
int a[5001][5001];
void FindKPosition(){
	int i = n,j = n;
	while (j > 0){
		if (a[n][j] < k) break;               
		j --;
	}
        j++;
	while (a[i][j] != k){
		while (a[i][j]>k && i > 1) i --;
		while (a[i][j]<k && j <= n) j++;
	}
	       answerx=i;
               answery=j;             
}

int main(){
	int i,j;
	cin >> n;
	for (i = 1;i <= n;i ++)
		for (j = 1;j <= n;j ++)
			cin >> a[i][j];
	cin >> k;
	FindKPosition();
	cout << answerx << " " << answery << endl;
     return 0;
}

洛谷:B2102

Scroll to Top