引入
假设给我们一个 n ∗ m n*m n∗m的矩形,里面依次填入坐标,从 ( 1 , 1 ) (1,1) (1,1)开始;
映射方式其实就是将这些坐标依次填入一个 n ∗ m n*m n∗m的一维数组;
解释
公式为
(
x
−
1
)
∗
m
+
y
(x-1)*m+y
(x−1)∗m+y
其中 ( x − 1 ) ∗ m (x-1)*m (x−1)∗m表示在当前数之前已经有几个数;
而 + y +y +y则代表自己是第几个数;
比如上图中的 ( 2 , 1 ) (2,1) (2,1)代入公式,前面有 m m m个数,自己是第1个数;因此映射到第 m + 1 m+1 m+1位;
例题
具体见代码中的 g e t ( x , y ) get(x,y) get(x,y)函数
Code
#include <iostream>
using namespace std;
const int N = 4e4+10;
int p[N];
int _find(int x){
if(p[x] == x) return x;
return _find(p[x]);
}
int n,m;
int get(int x,int y){
return (x-1)*n+y;
}
int main(){
cin >> n >> m;
for(int i=1;i<=n*n;++i) p[i] = i;
int x,y;
char d;
int ans = -1;
for(int i=1;i<=m;++i){
cin >> x >> y >> d;
int xx = get(x,y),yy;
if(d == 'D'){
yy = get(x+1,y);
}else{
yy = get(x,y+1);
}
int pxx = _find(xx);
int pyy = _find(yy);
if(pxx == pyy){
ans = i;
break;
}
p[pxx] = pyy;
}
if(ans == -1) cout << "draw\n";
else cout << ans << '\n';
return 0;
}
补充说明
如果坐标从 ( 0 , 0 ) (0,0) (0,0)开始
那么公式为 x ∗ m + y x*m+y x∗m+y