农夫约翰想用他购买的新监视系统监视他的
第 头奶牛位于具有整数坐标的位置
。
没有两头奶牛占据相同的位置。
约翰的监视系统包含三个特殊的摄像头,每个摄像头都能够沿垂直或水平线观察一条线上所有的奶牛。
请确定约翰是否可以通过合理设置三个摄像头的摆放位置,以便他可以监视所有
也就是说,请确定是否可以通过三条垂直或水平摆放的线将所有
输入格式
第一行包含整数 。
接下来 行,每行包含两个整数
,表示一头奶牛所在位置的横纵坐标。
输出格式
如果可以通过三条垂直或水平摆放的线将所有 个奶牛所在位置全部覆盖,请输出
,否则输出
。
数据范围
输入样例:
6
1 7
0 0
1 2
2 0
1 4
3 4
输出样例:
1
样例解释
#include<iostream>
#include<unordered_set>
#define x first
#define y second
using namespace std;
const int N = 50010;
typedef pair<int, int> PII;
int n;
PII q[N];
unordered_set<int> row, col;
int dfs(int u, int cnt){
if(cnt > 3) return 0;
if(u == n) return 1;
if(row.count(q[u].x) || col.count(q[u].y))
return dfs(u + 1, cnt);
row.insert(q[u].x);
if(dfs(u + 1, cnt + 1)) return 1;
row.erase(q[u].x);
col.insert(q[u].y);
if(dfs(u + 1, cnt + 1)) return 1;
col.erase(q[u].y);
return 0;
}
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d%d", &q[i].x, &q[i].y);
printf("%d\n", dfs(0, 0));
return 0;
}