问题描述:
给定n个数的序列,判断是否可以为矩阵内的路径。
思路:
先判断出x,y的值,O(n)模拟一遍判断即可。
给定n个数的序列,判断是否可以为矩阵内的路径。
思路:
先判断出x,y的值,O(n)模拟一遍判断即可。
对于y值的判断,我想着一遍扫描直接得出结果使得程序更加繁杂。
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const int maxn = 200000 + 5;
const int inf = 1000000000;
int a[maxn], d[maxn];
int n;
bool all_one() {
for(int i = 1; i < n; ++i)
if(d[i] != 1) return false;
return true;
}
bool check(int &x, int &y) {
for(int i = 1; i < n; ++i) {
if(d[i] != 1) y = d[i];
}
for(int i = 1;i < n; ++i) {
if(d[i] != 1 && d[i] != y) return false;
}
x = inf;
if(y == 0) return false;
int prer = (a[0] - 1) / y + 1, prec = (a[0] - 1)% y + 1;
for(int i = 1; i < n; ++i) {
int r = (a[i] - 1) / y + 1, c = (a[i] - 1) % y + 1;
if(c < 1 || c > y) return false;
if(abs(r - prer) + abs(c - prec) != 1) return false;
prer = r, prec = c;
}
return true;
}
int main() {
while(cin >> n) {
int x, y;
for(int i = 0; i < n; ++i) {
cin >> a[i];
if(i == 0) continue;
d[i] = abs(a[i] - a[i - 1]);
}
if(all_one()) {
x = inf, y = inf;
puts("YES");
cout << x << ' ' << y << endl;
}
else {
if(check(x, y)) {
puts("YES");
cout << x << ' ' << y << endl;
}
else puts("NO");
}
}
return 0;
}