您的位置:首页 > 其它

迷宫问题求解

2012-05-30 21:58 204 查看
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define MAZE_INIT_SIZE 50
using namespace std;
struct P{
int row;
int col;
int pre;
};

struct MAZE{
char m[MAZE_INIT_SIZE][MAZE_INIT_SIZE];
int row,col;
P s;//起点
P e;//终点
};

int f_row[4]={1,-1,0,0};
int f_col[4]={0,0,1,-1};

int check(int i,int j,struct MAZE maze)//判断
{

if(i<0||j<0||i>=maze.row||j>=maze.col)
return 0;
if(maze.m[i][j]=='o')
return 1;
return 0;
}
void search(struct MAZE &maze);
void maze_game()
{
struct MAZE maze;

printf("%15s","");
cout<<"请输入迷宫的行数";
cin>>maze.row;
while(maze.row<1)
{printf("%15s","");cout<<"输入错误,请重新输入";cin>>maze.row;}

printf("%15s","");
cout<<"请输入迷宫的列数";
cin>>maze.col;
while(maze.col<1)
{printf("%15s","");cout<<"输入错误,请重新输入";cin>>maze.col;}
system("cls");
printf("%15s","");cout<<"注意:坐标从0开始\n";
printf("%15s","");
cout<<"请输入迷宫的起始点坐标";
cin>>maze.s.row;
cin>>maze.s.col;
maze.s.pre=-1;
while(maze.s.row<0||maze.s.col<0||maze.s.row>=maze.row||maze.s.col>=maze.col)
{printf("%15s","");cout<<"输入错误,请重新输入";cin>>maze.s.row>>maze.s.col;}

printf("%15s","");
cout<<"请输入迷宫的起始点坐标";
cin>>maze.e.row;
cin>>maze.e.col;
maze.e.pre=-1;
while(maze.e.row<0||maze.e.col<0||maze.e.col>=maze.col||maze.e.row>=maze.row)
{printf("%15s","");cout<<"输入错误,请重新输入";cin>>maze.e.row>>maze.e.col;}
system("cls");
//printf("%15s","");
cout<<"请输入迷宫地形,o表示空地#表示墙壁\n";

int i,j;
for(i=0;i<maze.row;i++)
for(j=0;j<maze.col;j++)
{/*printf("\n%15s","");*/cin>>maze.m[i][j];}
/*cout<<maze.row<<endl<<maze.col<<endl;
cout<<maze.s.row<<' '<<maze.s.col<<endl;
cout<<maze.e.row<<' '<<maze.e.col<<endl;
for(i=0;i<maze.row;i++)
{for(j=0;j<maze.col;j++)
cout<<maze.m[i][j];
cout<<endl;
}*/
search(maze);
}
void output(int end,P sq[]);
void search(struct MAZE &maze)
{
P sq[MAZE_INIT_SIZE*MAZE_INIT_SIZE];
int begin=0,end=1;
maze.m[maze.s.row][maze.s.col]='#';
sq[0].pre=-1;
sq[0].row=maze.s.row;
sq[0].col=maze.s.col;
int i,j,k;
while(begin<end)
{
for(k=0;k<4;k++)
{
i=sq[begin].row+f_row[k];
j=sq[begin].col+f_col[k];
if(check(i,j,maze))
{sq[end].row=i;
sq[end].col=j;
sq[end].pre=begin;
maze.m[i][j]='#';

if((i==maze.e.row)&&(j==maze.e.col))
{
system("cls");
printf("%5s","");cout<<"路径\n";
printf("%5s","");
output(end,sq);
cout<<endl;
return ;
}
end++;
}
}
begin++;
}
system("cls");
printf("%15s","");
cout<<"没有可达路径";
}

void output(int end,P sq[])//输出
{
if(end==0)
{cout<<"("<<sq[end].row<<","<<sq[end].col<<")";return ;}

if(end>0)
{output(sq[end].pre,sq);cout<<"-->("<<sq[end].row<<","<<sq[end].col<<")";return ;}
}

int main(int argc, char *argv[])
{maze_game();
system("PAUSE");
return EXIT_SUCCESS;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: