这道题是用分支限界法的一道题目,与之前用回溯法的走迷宫问题稍有不同。
#include <stdio.h>
#include <queue>
using namespace std;
int map[12][12];
int xin, yin, xout, yout, steps = 0;
int walk[4][2]= //走一格后的横纵坐标变化
{
0, -1, //左
+1, 0, //下
0, +1, //右
-1, 0 //上
};
struct node{
int x;
int y;
int length;
};
queue<node> q;
void bfs();
int canmoveto(node p, int d);
node moveto(node p, int d);
int main ()
{
node p;
char ss;
int i, j;
scanf ("%d%d", &xin, &yin);
scanf("%d%d", &xout, &yout);
xin--,yin--,xout--,yout--;
getchar ();
for (i = 0; i < 12; i++)
{
for (j = 0; j < 12; j++)
{
scanf ("%c", &ss);
if (ss == '.') map[i][j] = 1;
else map[i][j] = 0;
}
getchar();
}
p.length = 0;
p.x = xin;
p.y = yin;
q.push(p);
bfs();
printf ("%d", steps);
return 0;
}
void bfs()
{
node p, pp;
int d;
while (!q.empty())
{
p = q.front();
q.pop();
for (d = 0; d < 4; d++)
{
if (canmoveto(p, d))
{
pp = moveto(p, d);
map[pp.x][pp.y] = 0;
if (pp.x == xout && pp.y == yout)
{
steps = pp.length;
return ;
}
}
}
}
}
int canmoveto (node p, int d)
{
node pp;
pp.x = p.x + walk[d][0];
pp.y = p.y + walk[d][1];
if (pp.x<12 && pp.x>=0 && pp.y<12 && pp.y>=0 && map[pp.x][pp.y] == 1) return 1;
else return 0;
}
node moveto(node p, int d)
{
node pp;
pp.x = p.x + walk[d][0];
pp.y = p.y + walk[d][1];
pp.length = p.length + 1;
q.push(pp);
return pp;
}