印刷电路板将布线区域划分为n*m个方格阵列,如下图所示。
精确的电路布线要求确定连接方格a的中点到方格b的最短布线方案。在布线时,电路只能沿直线或直角布线。为了避免电路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。
利用分支限界法求解,运用逐渐标记的方式进行,解题思路如下图所示:
其中黄色部分用来进行边界封锁。
参考代码如下:
#include <stdio.h>
#include <stdlib.h>
#define N 8
int a[N][N]={0};
typedef struct QNode{
int x;
int y;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}Queue;
int initQueue(Queue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
return -1;
Q.front->next=NULL;
return 1;
}
int emptyQueue(Queue Q)
{
if (Q.front==Q.rear)
return 1;
else
return 0;
}
int destroyQueue(Queue &Q)
{
while(Q.front){
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return 1;
}
int enQueue(Queue &Q, int x, int y)
{
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
return -1;
p->x=x;
p->y=y;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return 1;
}
int deQueue(Queue &Q, int &x, int &y)
{
QueuePtr p;
if(Q.front==Q.rear)
return -1;
p=Q.front->next;
x=p->x;
y=p->y;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return 1;
}
Queue loadingQueue;
int main()
{
int startX, startY, endX, endY,x,y,tempX, tempY;
int offset[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int numofNeigh=4;
int i,j,k;
int length;
initQueue(loadingQueue); //初始化队列
a[1][3]=a[2][3]=a[2][4]=a[3][5]=a[4][4]=a[4][5]=a[5][1]=a[5][5]=a[6][1]=a[6][2]=a[6][3]=a[7][1]=a[7][2]=a[7][3]=1;
for(i=0;i<N;i++)
{
a[i][N-1]=a[i][0]=1;
a[0][i]=a[N-1][i]=1;
}
startX=3, startY=2, endX=4, endY=6;
a[startX][startY]=2;
x=startX, y=startY;
do{
for(i=0;i<numofNeigh;i++)
{
tempX=x+offset[i][0], tempY=y+offset[i][1];
if(a[tempX][tempY]==0)
{
a[tempX][tempY]=a[x][y]+1;
if (tempX==endX && tempY==endY) break;
enQueue(loadingQueue, tempX, tempY);
}
}
/*for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%3d",a[i][j]);
putchar('\n');
}
printf("=========================\n");*/
if(tempX==endX && tempY==endY)
{
printf("found.\n");
break;
}
if(emptyQueue(loadingQueue))
{
printf("no solution");
return 0;
}
deQueue(loadingQueue, x,y);
}while(1);
//找到路径
length=a[endX][endY]-2;
x=endX, y=endY;
printf("%d %d\n",x,y);
for(i=length;i>0;i--)
{
for(j=0;j<numofNeigh;j++)
{
tempX=x+offset[j][0], tempY=y+offset[j][1];
if(a[tempX][tempY]==i+1)
{
printf("%d %d\n",tempX, tempY);
break;
}
}
x=tempX, y=tempY;
}
return 0;
}