测试代码:
1 0 0 0 0 0 1 0
0 1 1 0 0 0 1 0
0 0 1 0 1 0 1 0
0 1 -1 0 1 0 0 0
0 1 0 1 0 1 1 0
0 0 1 0 0 1 0 0
1 0 1 0 0 1 0 1
0 0 1 0 0 -2 0 0
1代表障碍,0代表能走通,-1代表入口 2代表出口路径
本题我使用的是递归调用的方法解决的,
是一种深收的算法,呵呵!!!废话不多说,看哥的
精彩程序吧!!!
这里 0代表能走通,1代表障碍,2代表通道,3代表起始点和终止点
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#define INT_SIZE 1000
using namespace std;
int a[100][100];//声明数组,用来存每个坐标
int path[100];//声明数组,用来存放通道路径
int n=0,k=0;//标记作用
int Find(int i1,int j1,int line1,int rows1)//递归程序
{
int i,j,line,rows,mark=0;
i=i1;
j=j1;
line=line1;
rows=rows1;
if(a[i][j]==-2)
return 1;
if(a[i][j]==1||a[i][j]==5)
return 0;
else
{
a[i][j]=5;
if(i==0&&j==0&&mark!=1)//左上角
{
if(Find(i+1,j,line,rows)==1)
n=1;
else
if(Find(i,j+1,line,rows)==1)
n=1;
if(n>0)
{
path[k]=i*rows+j;
k++;
return k;
}
mark=1;
}
if(i==0&&j==rows-1&&mark!=1)//右上角
{
if(Find(i,j-1,line,rows)==1)
n=1;
else if(Find(i+1,j,line,rows)==1)
n=1;
if(n>0)
{
path[k]=i*rows+j;
k++;
return k;
}
mark=1;
}
if(i==line-1&&j==0&&mark!=1)//左下角
{
if(Find(i-1,j,line,rows)==1)
n=1;
else if(Find(i,j+1,line,rows)==1)
n=1;
if(n>0)
{
path[k]=i*rows+j;
k++;
return k;
}
mark=1;
}
if(i==line-1&&j==rows-1&&mark!=1)//右下角
{
if(Find(i,j-1,line,rows)==1)
n=1;
else if(Find(i-1,j,line,rows)==1)
n=1;
if(n>0)
{
path[k]=i*rows+j;
k++;
return k;
}
mark=1;
}
if(i==0&&mark!=1)//上边界
{
if(Find(i,j-1,line,rows)==1)
n=1;
else
{
if(Find(i,j+1,line,rows)==1)
n=1;
else if(Find(i+1,j,line,rows)==1)
n=1;
}
if(n>0)
{
path[k]=i*rows+j;
k++;
return k;
}
mark=1;
}
if(j==0&&mark!=1)//左边界
{
if(Find(i-1,j,line,rows)==1)
n=1;
else
{
if(Find(i+1,j,line,rows)==1)
n=1;
else if(Find(i,j+1,line,rows)==1)
n=1;
}
if(n>0)
{
path[k]=i*rows+j;
k++;
return k;
}
mark=1;
}
if(i==line-1&&mark!=1)//下边界
{
if(Find(i,j-1,line,rows)==1)
n=1;
else
{
if(Find(i,j+1,line,rows)==1)
n=1;
else if(Find(i-1,j,line,rows)==1)
n=1;
}
if(n>0)
{
path[k]=i*rows+j;
k++;
return k;
}
mark=1;
}
if(j==rows-1&&mark!=1)//右边界
{
if(Find(i-1,j,line,rows)==1)
n=1;
else
{
if(Find(i+1,j,line,rows)==1)
n=1;
else if(Find(i,j-1,line,rows)==1)
n=1;
}
if(n>0)
{
path[k]=i*rows+j;
k++;
return k;
}
mark=1;
}
if(mark!=1)//普通点
{
if(Find(i-1,j,line,rows)==1)
n=1;
else
{
if(Find(i+1,j,line,rows)==1)
n=1;
else
{
if(Find(i,j-1,line,rows)==1)
n=1;
else if(Find(i,j+1,line,rows)==1)
n=1;
}
}
if(n>0)
{
path[k]=i*rows+j;
k++;
return k;
}
mark=1;
}
}
return 0;
}
int main()
{
int line,rows,i,j,starti,startj,endi,endj;
printf("欢迎使用本迷宫求解系统\n");
printf("---------------------------------------------------\n");
printf("请输入迷宫的行数和列数:\n");
cin>>line>>rows;
memset(a,0,sizeof(a));
memset(path,-1,sizeof(path));
printf("请输入障碍点坐标的个数:\n");
int num,m;
cin>>num;
m=num;
while(m--)
{
printf("请输入第%d个障碍点的坐标:\n",num-m);
cin>>i>>j;
a[i][j]=1;
}
printf("请输入迷宫起始点的坐标:\n");
cin>>starti>>startj;
a[starti][startj]=-1;
printf("请输入迷宫出口点的坐标:\n");
cin>>endi>>endj;
a[endi][endj]=-2;
i=starti;
j=startj;
if(Find(i,j,line,rows)>0)
{
cout<<"Great"<<endl;
for(k=0;path[k]!=-1;k++)
{
i=path[k]/rows;
j=path[k]%rows;
a[i][j]=2;
}
a[starti][startj]=3;
a[endi][endj]=3;
for(i=0;i<line;i++)
{
for(j=0;j<rows;j++)
{
if(a[i][j]==5)
a[i][j]=0;
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
else
cout<<"由于您输入错误,此迷宫没有出路"<<endl;
return 0;
}