電路佈線問題

#include <iostream>
#include <queue>


using namespace std;


#define M 10
#define N 10


typedef struct{
    int row,col;
}Position;


int grid[M+2][N+2];
int Pathlen;
Position * path;


bool findPath(Position start,Position finish){
    if(start.row==finish.row && finish.col == finish.col) {Pathlen = 0; return true;}
    for(int i=0;i<N+2;i++){
        grid[0][i] = grid[M+1][i] = -2; //圍牆
    }
    for(int i=0;i<M+2;i++){
        grid[i][0] = grid[i][N+1] = -2;
    }
    for(int i=1;i<M+1;i++){
        for(int j=1;j<N+1;j++){
            grid[i][j]=-1;
        }
    }
    //初始化四個方向的相對位置
    Position offset[4];
    offset[0].row=0;offset[0].col=1;//right
    offset[1].row=1;offset[1].col=0;//down
    offset[2].row=0;offset[2].col=-1;//left
    offset[3].row=-1;offset[3].col=0;//up


    int NumofNbrs = 4;
    Position here,nbr;
    here.row=start.row;here.col=start.col;
    grid[start.row][start.col]=0;   //初始位置爲0
    queue<Position> Q;
    do{
        for(int i=0;i<NumofNbrs;i++){
            nbr.row = here.row+offset[i].row;
            nbr.col = here.col+offset[i].col;
            if(grid[nbr.row][nbr.col]==-1){grid[nbr.row][nbr.col]=grid[here.row][here.col]+1;}
            if(nbr.row==finish.row && nbr.col==finish.col) break;
            Q.push(nbr);
        }
        if(nbr.row==finish.row && nbr.col==finish.col) break;
        if(Q.empty()) return false;    //拓展節點用完但還未到終點,無解
        here = Q.front();
        Q.pop();
    }while(true);
    //逆向構造最短佈線方案
    Pathlen = grid[finish.row][finish.col];
    path = new Position[Pathlen];
    here = finish;
    for(int j=Pathlen-1;j>=0;j--){
        path[j]=here;
        for(int i=0;i<NumofNbrs;i++){
            nbr.row = here.row+offset[i].row;
            nbr.col = here.col+offset[i].col;
            if(grid[nbr.row][nbr.col]==j) break;
        }
        here = nbr;
    }
    return true;
}


int main()
{
    Position start,finish;


    cout<<"###########  Tips: 最大行列數爲"<<M<<"  ############"<<endl;
    cout<<"起點(行,列):";
    cin>>start.row>>start.col;


    cout<<"終點(行,列):";
    cin>>finish.row>>finish.col;


    if(findPath(start,finish)==true){
        cout<<"電路佈線路徑如下:"<<endl;
        cout<<start.row<<","<<start.col<<endl;
        for(int i=0;i<Pathlen;i++){
            cout<<path[i].row<<","<<path[i].col<<endl;
        }
    }else{cout<<"沒有路徑!"<<endl;}
    return 0;
}
發佈了40 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章