P8073 [COCI2009-2010#7] BAKICE
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
char c[105][105];
int cnt;
struct rz{
int x,y;
}l[10005],r[10005];
int le,re;
struct pi{
double x;
rz a,b;
}a[10005];
bool cmp(pi x,pi y){
return x.x < y.x;
}
double ajld(int x_1,int y_1,int x_2,int y_2){
return sqrt((x_1 - x_2) * (x_1 - x_2) + (y_1 - y_2) * (y_1 - y_2));
}
int vis[105][105];
int dis[105][105];
signed main(){
cin >> n >> m;
for(int i = 1 ; i <= n ; i ++){
for(int j = 1 ; j <= m ; j ++){
cin >> c[i][j];
if(c[i][j] == 'L'){
le ++;
l[le].x = i;
l[le].y = j;
}
if(c[i][j] == 'X'){
re ++;
r[re].x = i;
r[re].y = j;
}
}
}
for(int i = 1 ; i <= re ; i ++){
for(int j = 1 ; j <= le ; j ++){
cnt ++;
a[cnt].x = ajld(r[i].x , r[i].y , l[j].x , l[j].y);
a[cnt].a.x = r[i].x;
a[cnt].a.y = r[i].y;
a[cnt].b.x = l[j].x;
a[cnt].b.y = l[j].y;
}
}
int ans = 0;
sort(a + 1 , a + 1 + cnt , cmp);
for(int i = 1 ; i <= cnt ; i ++){
if(vis[a[i].a.x][a[i].a.y] > 0)continue;
if(vis[a[i].b.x][a[i].b.y] == 0){
vis[a[i].b.x][a[i].b.y] = a[i].x;
vis[a[i].a.x][a[i].a.y] ++;
continue;
}
if(a[i].x >= vis[a[i].b.x][a[i].b.y] && !dis[a[i].b.x][a[i].b.y]){
dis[a[i].b.x][a[i].b.y] = 1;
ans ++;
}
vis[a[i].a.x][a[i].a.y] ++;
}
cout << ans;
return 0;
}