#include <iostream> #include <map> #define int long long int using namespace std; int flag1, flag2; map <int,int> mp; int ans; void solve ( int x1, int x2 ) { if ( x2 == 0 && x1 != 0 && ( flag1 == -1 || flag2 == -1 ) ) { if ( flag2 == -1 && mp[x2 + 1] != 1) { mp[ x2 + 1 ] = 1; flag2 = 1, ans += 1; } if ( flag1 == -1 && mp[ x2 - 1 ] != 1 ) { mp[ x2 - 1 ] = 1; flag1 = 1, ans += 1; solve( mp[x2 - 1], x2 - 1 ); } } if ( x1 == 1 && ( flag1 == -1 || flag2 == -1 ) ) { if ( x2 > 0 ) { if ( flag2 == -1 && mp[x2 - 1] != 2 ) { mp[ x2 - 1 ] = 2; flag2 = 1, ans += 1; solve( mp[x2 - 1], x2 - 1 ); } else flag2 = 1; } else { if ( flag1 == -1 && mp[ x2 + 1 ] != 2 ) { mp[ x2 + 1 ] = 2; flag1 = 1, ans += 1; } else flag1 = 1; } } else if ( x1 == 2 && ( flag1 == -1 || flag2 == -1 ) ) { if ( x2 > 0 ) { if ( flag2 == -1 && mp[x2 - 1] != 1) { mp[ x2 - 1 ] = 1; flag2 = 1, ans += 1; solve( mp[x2 - 1], x2 - 1 ); } } else { if ( flag1 == -1 && mp[ x2 + 1 ] != 1 ) { mp[ x2 + 1 ] = 1; flag1 = 1, ans += 1; } else flag1 = 1; } } //第二次遍历开始计算需要增加的最小的数量 return; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while ( t-- ) { int n; ans = 0; flag1 = -1, flag2 = -1; int ans2 = 100; cin >> n; for ( int i = 1; i <= n; i++ ) { int r,c; cin >> r >> c; if ( mp[c] == 0 ) mp[c] = r; else if ( mp[c] != 0 ) mp[c] = 3; // 上下同时具有堵住的位置 } if ( ( mp[1] == 1 && mp[-1] == 1 && mp[0] != 2 ) || ( mp[1] == 1 && mp[-1] != 1 && mp[0] == 2 ) || ( mp[1] != 1 && mp[-1] == 1 && mp[0] == 2 ) ) { if ( flag1 == -1 || flag2 == -1 ) ans2 = 1; } for ( auto & x : mp ) { int x1 = x.second; // value 1或2 int x2 = x.first; // key 横坐标 if ( x2 == 0 && x1 != 0 && ( flag1 == -1 || flag2 == -1 ) ) { if ( mp[x2 - 1] == 1 ) flag1 = 1; if ( mp[x2 + 1] == 1 ) flag2 = 1; } else if ( x1 == 3&& ( flag1 == -1 || flag2 == -1 ) ) { if ( x2 > 0 ) flag2 = 1; else flag1 = 1; } else if ( x1 == 1 && ( flag1 == -1 || flag2 == -1 ) ) { if ( mp[x2 - 1] == 2 || mp[x2 + 1] == 2 ) { if ( x2 > 0 ) flag2 = 1; else flag1 = 1; } } else if ( x1 == 2 && ( flag1 == -1 || flag2 == -1 ) ) { if ( mp[x2 - 1] == 1 || mp[x2 + 1] == 1 ) { if ( x2 > 0 ) flag2 = 1; else flag1 = 1; } } } for ( auto & x : mp ) solve( x.second, x.first ); if ( flag2 == -1 ) ans += 2; if ( flag1 == -1 ) ans += 2; ans = min( ans, ans2 ); if ( ans >= 3 ) cout << 3 <<endl; else cout << ans << endl; mp.clear(); } return 0; }
全部评论
(0) 回帖