布线问题

#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;
}

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值