#include<iostream>
using namespace std;
#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;
cout<<"请输入起点和终点的坐标!\n";
cin>>startx>>starty>>endx>>endy; //输入起点和终点的坐标
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;
// a[0][2]=a[1][2]=a[1][3]=a[3][5]=a[4][4]=a[4][5]=a[5][5]=a[5][1]=a[6][1]=a[6][2]=a[6][3]=a[7][1]=a[7][2]=a[7][3]=1;
//上条语句为设置边线,即设置不可以通过的地点 设置为1 可以通过的为0
for(int i=0;i<N;i++)
{
a[0][i]=a[i][0]=1;
a[N-1][i]=a[i][N-1]=1;
} // 设置边界
int x=startx,y=starty,x1,y1; //从起点开始遍历 广度优先遍历! x1,y1为遍历过程中的下个地点位置 x,y为当前地点位置!
initQueue(loadingQueue); //初始化队列
int direction[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; //初始化方向数组,分别为向右 向下 向左 向上
a[x][y]=2;
do
{
for(int i=0;i<4;i++)//四个方向
{
x1=x+direction[i][0]; y1=y+direction[i][1]; //通过上一个地点 x,y 和前进的方向 确定下一个地点的位置
if(a[x1][y1]==0) //如果下一个地点值为0 即可走。。
{
a[x1][y1]=a[x][y]+1; //该点的值为上一点的值+1 表示前进了一步!
if(x1==endx&&y1==endy)
break;
enQueue(loadingQueue,x1,y1);
}
}
if(x1==endx&&y1==endy)
//第一次错误此处写成了x==endx&&y==endy 导致一直输出无路径 很尴尬!!!
{
cout<<"find!\n";
break;
}
cout<<"a ";
if(emptyQueue(loadingQueue))
{
cout<<"无路径!\n";
return 0;
}
deQueue(loadingQueue,x,y);
} while(1) ; //遍历搜索完成!
int length=a[endx][endy]-2;
x=endx, y=endy;
printf("%d %d\n",x,y);
for(i=length;i>0;i--)
{
for(int j=0;j<4;j++)
{
x1=x+direction[j][0], y1=y+direction[j][1];
if(a[x1][y1]==i+1)
{
printf("%d %d\n",x1, y1);
break;
}
}
x=x1, y=y1;
}
// 输出路径
for(i=0;i<N;i++)//输出数组查看路径是否正确
{
for(int j=0;j<N;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}