#include "cstdio"
#include "queue"
#define MAX 20
#define INF 999
using namespace std;
struct Position
{
int row; //行
int col; //列
};
queue<Position> q;
Position path[MAX]; //布线路径
//start---起始位置, finish---终止位置, n---行数,m---列数
//grid---方格阵列,pathLen---布线路径长度
//如果布线成功,返回1,失败返回0
int findPath(Position &start, Position &finish, int n, int m, int grid[9][9], int &pathLen)
{
if(start.row==finish.row && start.col==finish.col)
{
pathLen = 0;
return 1;
}
//在外层布“墙”,1表示不可以布线
int i;
for(i=0; i<=n+1; i++) //最左和最右边的列
grid[i][0] = grid[i][m+1] = 1;
for(i=0; i<=m+1; i++) //最上和最下边的行
grid[0][i] = grid[n+1][i] = 1;
//四个位移方向
Position offet[4];
offet[0].row = 0; offet[0].col = 1; //下
offet[1].row = 0; offet[1].col = -1; //上
offet[2].row = 1; offet[2].col = 0; //右
offet[3].row = -1; offet[3].col = 0; //左
grid[start.row][start.col] = 2; //距离从2递增
Position next;
Position now;
now = start;
//布线
do{
for(i=0; i<4; i++) //向相邻的四个方向移动
{
next.row = now.row + offet[i].row; //下一个相邻的位置
next.col = now.col + offet[i].col;
if(grid[next.row][next.col]==0) //如果还没有布线
{
grid[next.row][next.col] = grid[now.row][now.col] + 1; //布线,距离增加
if(next.row==finish.row && next.col==finish.col) //如果已经到达目标位置
break;
q.push(next); //入队列
}
}
if(next.row==finish.row && next.col==finish.col) //如果已经到达目标位置
break;
if(q.empty()) //如果队列空,但布线仍未万未完成
return 0;
now = q.front(); //下一个位置
q.pop();
}while(true);
//构造最短布线路径
pathLen = grid[finish.row][finish.col]-2; //路径长度,因为是从2开始递增的,所以-2
now = finish;
Position back;
int j;
for(i=pathLen-1; i>=0; i--) //从终点追寻到起点
{
path[i] = now;
for(j=0; j<4; j++)
{
back.row = now.row + offet[j].row;
back.col = now.col + offet[j].col;
if(grid[back.row][back.col]==i+2)
{
break;
}
}
now = back; //往回移动
}
return 1;
}
int main()
{
int n = 7;
int m = 7;
int grid[9][9] = {
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 1, 0, 0, 0, 0, 1},
{1, 0, 0, 1, 1, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 1, 0, 0, 1},
{1, 0, 0, 0, 1, 1, 0, 0, 1},
{1, 1, 0, 0, 0, 1, 0, 0, 1},
{1, 1, 1, 1, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 0, 1},
};
Position start, finish;
start.row = 3; start.col = 2;
printf("起点:%d, %d\n", start.row, start.col);
finish.row = 4, finish.col = 6;
printf("终点:%d, %d\n", finish.row, finish.col);
printf("布线方格阵列:\n");
int i, j;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
printf("%d ", grid[i][j]);
printf("\n");
}
int pathLen;
int find = findPath(start, finish, n, m, grid, pathLen);
if(find==true)
{
printf("布线长度:%d\n", pathLen);
printf("布线路径:\n");
printf("%d, %d\n", start.row, start.col);
for(i=0; i<pathLen; i++)
{
printf("%d, %d\n", path[i].row, path[i].col);
}
printf("布线之后的方阵:\n");
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
printf("%d ", grid[i][j]);
printf("\n");
}
}
else
printf("布线失败\n");
return 0;
}
布线问题
最新推荐文章于 2023-10-27 20:00:54 发布