1.这个是迷宫,1代表墙,0代表通路。
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 10 0 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1
1 1 0 0 0 0 0 0 1 1
1 1 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 1 1 1
2.用栈来存通路的位置信息,这里我没有用库里的栈,我自己实现了一个栈
#pragma once
template<typename T>
class Stack
{
public:
Stack()
:_data(0)
,_size(0)
,_capacity(0)
{}
void Push(const T& x)
{
Checkcapacity();
_data[_size++]=x;
}
void Pop()
{
assert(_size>0);
--_size;
}
T& Top()
{
return _data[_size-1];
}
bool Empty()
{
return _size==0;
}
size_t size()
{
return _size;
}
~Stack()
{
if(_data!=NULL)
{
delete[] _data;
_size=0;
_capacity=0;
}
}
void display()
{
while(_size)
{
cout<<Top()<<" ";
Pop();
}
cout<<endl;
}
protected:
void Checkcapacity()
{
if(_size==_capacity)
{
size_t newcapacity=2*_capacity+3;
T* tmp=new T[newcapacity];
for(size_t i=0;i<_size;i++)
{
tmp[i]=_data[i];
}
delete[] _data;
_data=tmp;
_capacity=newcapacity;
}
}
protected:
T* _data;
size_t _size;
size_t _capacity;
};
3.
const int N=10;
struct Pos
{
Pos(int row=0,int col=0)
:_row(row)
,_col(col)
{}
int _row;
int _col;
};
void InitMaze(int* Maze) //初始化数组
{
FILE* fout=fopen("MazeMap.txt","r");
assert(fout);
for(size_t i=0;i<N;i++)
{
for(size_t j=0;j<N;)
{
char value=fgetc(fout);
if(value=='0'||value=='1')
{
Maze[i*N+j]=value-'0';
++j;
}
}
}
fclose(fout);
}
bool CheckAccess(Pos pos,int* Maze,int rows,int cols)
{
if((pos._row>=0)&&(pos._row <rows)&&(pos._col >=0)&&(pos._col <cols)&&(Maze[pos._row *cols+pos._col ]==0))
{
return true;
}
else
{
return false;
}
}
bool Getpath(Stack<Pos>& s,Pos entry,int* Maze)
{
s.Push (entry);
int cols=10;
int rows=10;
Maze[entry._row *cols+entry._col ]=2;
while(!s.Empty())
{
Pos cur=s.Top ();
//找到出口
if((cur._row ==rows-1)||(cur._row ==0)||(cur._col ==cols-1))
{
return true;
}
//上
Pos next=cur;
next._row -=1;
if(CheckAccess(next, Maze,cols ,rows ))
{
Maze[next._row *cols+next._col ]=2;
s.Push (next);
continue;
}
//右
next=cur;
next._col +=1;
if(CheckAccess(next, Maze,cols ,rows ))
{
Maze[next._row *cols+next._col ]=2;
s.Push (next);
continue;
}
//下
next=cur;
next._row +=1;
if(CheckAccess(next, Maze,cols ,rows ))
{
Maze[next._row *cols+next._col ]=2;
s.Push (next);
continue;
}
//左
next=cur;
next._col -=1;
if(CheckAccess(next, Maze,cols ,rows ))
{
Maze[next._row *cols+next._col ]=2;
s.Push (next);
continue;
}
//四个方向都不通
Maze[cur._row *cols+cur._col ]=3;
s.Pop();
}
return false; //没有出路
}
//找0
void printfMaze(int* Maze)
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout<<Maze[i*N+j]<<" ";
}
cout<<endl;
}
}
void TestMaze()
{
Pos pos(2,0);
Stack<Pos> s;
int Maze[10][10];
InitMaze((int*)Maze);
printfMaze((int*)Maze);
cout<<"是否有通路:"<<Getpath(s,pos,(int*)Maze)<<endl;
printfMaze((int*)Maze);
}