用栈实现,深度搜索
#include<iostream>
#include<cstring>#include<stack>
using namespace std;
struct node{
int x,y,d;//横纵坐标和方向
};
stack<node>s;
int path(int map[10][10],int move[8][2]){
node temp;
int x,y,d,i,j;
temp.x=1;temp.y=1;temp.d=-1; //入口点
s.push(temp);
while(!s.empty()){
temp=s.top();
s.pop();
x=temp.x; y=temp.y; d=temp.d+1;
while(d<8){
i=x+move[d][0]; j=y+move[d][1];
if(map[i][j]==0){
temp.x=x;temp.y=y;temp.d=d;
s.push(temp);
x=i;y=j;
map[x][y]=-1;
if(i==8 && j==8)
return 1;
else
d=0;
}
else
d++;
}
}
return 0;
}
void output(int map[10][10]){
for(int i=0;i<10;i++) {
for(int j=0;j<10;j++)
cout<<map[i][j]<<" ";
cout<<endl;
}
}
int main(){
int map[10][10];
memset(map,0,sizeof(map));
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(j==0 || j==9 || i==0 ||i==9)
map[i][j]=1;
else
map[i][j]=0;
}
}
map[1][3]=map[1][7]=map[2][3]=map[2][7]=1;
map[3][5]=map[3][6]=1;
map[4][2]=map[4][3]=map[4][4]=1;
map[5][4]=1;
map[6][2]=map[6][6]=1;
map[7][2]=map[7][3]=map[7][4]=map[7][6]=map[7][7]=1;
map[8][1]=1;
map[1][1]=0;//入口
map[8][8]=0;//出口
int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; //8个方向
cout<<"地图如下:"<<endl;
output(map);
system("pause");
path(map,move);
cout<<"路径如下:"<<endl;
node t;
while(!s.empty()){
t=s.top();
s.pop();
cout<<"("<<t.x<<","<<t.y<<") ";
}
cout<<endl;
system("pause");
return 0;
}
用队列实现,广度搜索,找出的是最短路径
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct node{
int x,y;//横纵坐标
};
int path(int map[10][10],int move[8][2]){
queue<node>q;
int x,y;
node temp;
temp.x=1;temp.y=1;
q.push(temp);
map[1][1]=8; //搜索过的不能再搜
while(!q.empty()){
temp=q.front();
q.pop();
for(int i=0;i<8;i++){
x=temp.x+move[i][0];
y=temp.y+move[i][1];
if(map[x][y]==0){
temp.x=x;
temp.y=y;
q.push(temp);
map[x][y]=8;
}
if(map[8][8]==8) //搜索过出口点说明已找到出口
return 1;
}
}
return 0;
}
void output(int map[10][10]){
for(int i=0;i<10;i++) {
for(int j=0;j<10;j++)
cout<<map[i][j]<<" ";
cout<<endl;
}
}
int main(){
int map[10][10];
memset(map,0,sizeof(map));
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(j==0 || j==9 || i==0 ||i==9)
map[i][j]=1;
else
map[i][j]=0;
}
}
map[1][3]=map[1][7]=map[2][3]=map[2][7]=1;
map[3][5]=map[3][6]=1;
map[4][2]=map[4][3]=map[4][4]=1;
map[5][4]=1;
map[6][2]=map[6][6]=1;
map[7][2]=map[7][3]=map[7][4]=map[7][6]=map[7][7]=1;
map[8][1]=1;
map[1][1]=0;//入口
map[8][8]=0;//出口
int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; //8个方向
cout<<"地图如下:"<<endl;
output(map);
system("pause");
if(path(map,move))
cout<<"已找到出口"<<endl;
else
cout<<"靠,没出口"<<endl;
cout<<"尝试如下:"<<endl;
output(map);
system("pause");
return 0;
}