历尽艰难万险过了的bfs水题感动TUT。类似连连看,但是判断是否从起点能连到终点和求最小转弯数。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int n, m;
struct node{
int d, x, y, t;
};
#define N 100
int dir[4][2] = {
1, 0, -1, 0, 0, 1, 0, -1
};
int sx, sy, ex, ey;
bool f( int e, int r )
{
return (e >= 0 && e <= m+1 && r >= 0 && r <= n+1);
}
char a[N][N];
int vis[N][N];
int ans;
void bfs( )
{
queue<node> q;
while(!q.empty())
q.pop();
memset(vis, 0, sizeof(vis));
node st, ed;
st.t = 0, st.x = sx, st.y = sy, st.d = -1;
ed.x = ex, ed.y = ey;
q.push(st);
vis[sx][sy] = 1;
ans = 999999;
while( !q.empty() )
{
node now = q.front();
q.pop();
//printf("%d %d\n", now.x, now.y);
bool ff = 0;
for( int i = 0; i < 4; i++ )
{
int xx = now.x + dir[i][0];
int yy = now.y + dir[i][1];
if( xx == ed.x && yy == ed.y )
{
if( now.d != i )
now.t ++;
ans = min(ans, now.t);
ff = 1;
}
}
if( ff )
continue;
for( int i = 0; i < 4; i++ )
{
int xx = now.x + dir[i][0];
int yy = now.y + dir[i][1];
if ( f( xx, yy ) && (!vis[xx][yy] || vis[xx][yy] > now.t) && a[xx][yy] == ' ' )
{
node nxt;
nxt.x = xx;
nxt.y = yy;
nxt.d = i;
if( now.d != i )
nxt.t = now.t + 1;
else
nxt.t = now.t;
//if( nxt.t >= ans )
// continue;
q.push(nxt);
vis[xx][yy] = now.t;
}
}
}
}
int main()
{
int tt = 1;
while(~scanf("%d%d", &n, &m) && (n || m))
{
int ttt = 1;
getchar();
memset(a, ' ', sizeof(a));
for( int i = 1; i <= m; i++ )
{
for ( int j = 1; j <= n; j++ )
scanf("%c", &a[i][j]);
getchar();
}
printf("Board #%d:\n", tt++);
while( scanf("%d%d%d%d", &sy, &sx, &ey, &ex) && (sx || sy || ex || ey) )
{
bfs();
if( ans == 999999 )
printf("Pair %d: impossible.\n", ttt++);
else
printf("Pair %d: %d segments.\n", ttt++, ans);
}
puts("");
}
return 0;
}
/*
3 4
XXX
XXX
2 2 4 2 ---3
*/