题目:http://codeforces.com/problemset/problem/1130/C
分析:将起点和终点所在的块分别压缩在一个块里,如果他们同在一个块中,答案就是0;
如果不在一个块中,就枚举两个块中的点,求出距离的最小值。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 55;
const int INF = 0x3f3f3f3f;
char s[maxn][maxn];
int vis[maxn][maxn];
int dir[4][2] = {1,0,-1,0,0,1,0,-1};
int n;
struct node
{
int x;
int y;
};
node st,e;
void dfs(int x,int y,int val)
{
vis[x][y] = val;
for(int i = 0;i < 4;i ++)
{
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if(nx < 0 || nx >= n ||ny < 0 || ny >= n)
continue;
if(vis[nx][ny] == 0 && s[nx][ny] == '0')
{
dfs(nx,ny,val);
}
}
}
int main()
{
while(cin >> n)
{
memset(vis,0,sizeof(vis));
cin >> st.x >> st.y >> e.x >> e.y;
for(int i = 0;i < n;i ++)
{
cin >> s[i];
}
dfs(st.x - 1,st.y - 1,1);
if(vis[e.x- 1][e.y - 1] == 1) // 在同一个块中
{
printf("0\n");
break;
}
dfs(e.x - 1,e.y - 1,-1);
int ans = INF;
for(int i = 0;i < n;i ++)
for(int j = 0;j < n;j ++)
{
if(vis[i][j] == 1 && s[i][j] == '0')
{
for(int a = 0;a < n;a ++)
for(int b = 0;b < n;b ++)
{
if(vis[a][b] == -1 && s[a][b] == '0')
ans = min(ans,(a - i) * (a - i) + (b - j) * (b - j));
}
}
}
cout << ans << endl;
}
return 0;
}