运用分支限界法解决布线问题。
参考代码:
<span style="font-family:Courier New;">#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,i,j,k,length,numofNeigh=4;
int offset[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
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);
}
}
if(tempX==endX && tempY==endY)
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;
}</span><span style="font-family:KaiTi_GB2312;">
</span>