赞
踩
假设给我们一个 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)函数
#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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。