c++ 深度优先算法走迷宫
2017-01-13 00:00
459 查看
![](https://static.oschina.net/uploads/space/2017/0113/121547_CbzO_1474656.png)
c++ 深度优先算法走迷宫
将迷宫进行数据转换,0表示通路,1表示障碍物,9表示人;
1 1 1 1 1 1 1 1 1 1 1 1
9 0 0 0 0 0 0 1 0 0 0 1
1 1 1 0 1 1 1 1 0 1 0 1
1 0 1 0 1 1 1 1 0 1 0 1
1 0 1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 1 1 1 1 1 1 1
1 1 1 0 0 1 1 1 1 1 0 1
1 0 0 0 0 0 0 0 0 0 0 1
1 1 1 1 1 0 1 1 0 1 1 1
1 0 0 0 0 0 1 1 0 1 1 1
1 0 0 0 1 0 0 1 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1
代码如下:
yuanzhen@ubuntu:~/C_script$ cat dfs_migong.cpp
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
struct node
{
int x;
int y;
};
typedef struct node Node;
vector<Node> route(144);
vector<vector<int> > vec;
vector<vector<int> > book(12,vector<int>(12,0));
int dx=10, dy=11,min=999999999;
int next[4][4]={{-1,0},{0,-1},{1,0},{0,1}};
void show(vector<vector<int> > avec)
{
vector<vector<int> >::const_iterator cit;
vector<int>::const_iterator it;
for(cit=avec.begin(); cit!=avec.end();++cit)
{
vector<int> pvec = *cit;
for(it=pvec.begin();it!=pvec.end();++it)
cout << *it << " ";
cout << endl;
}
}
vector<vector<int> > block(int x1, int y1, int x2, int y2, vector<vector<int> >avec)
{
for(int i=x1;i<=x2;++i)
{
for(int j=y1;j<=y2;++j)
avec[i][j]=1;
}
return avec;
}
vector<vector<int> > init()
{
vector<vector<int> > avec(12, vector<int>(12,0));
for(int i=0;i<12;++i)
{
avec[i][0]=1;
avec[i][11]=1;
}
for(int j=0;j<12;++j)
{
avec[0][j]=1;
avec[11][j]=1;
}
avec[1][0]=0; //in
avec[10][11]=0; // out
avec[2][1]=1;
avec[2][2]=1;
avec[3][2]=1;
avec[4][2]=1;
avec[6][2]=1;
avec[6][1]=1;
avec[1][7]=1;
avec=block(2,4,3,7,avec);
avec=block(5,5,6,9,avec);
avec=block(8,1,8,4,avec);
avec=block(8,6,9,7,avec);
avec=block(8,9,9,10,avec);
avec=block(2,9,4,9,avec);
avec[5][10]=1;
avec[10][7]=1;
avec[10][4]=1;
//avec[5][2]=1;
//avec[9][4]=1;
return avec;
}
void move();
void dfs(int sx, int sy, int step)
{
if(sx==dx && sy==dy)
{
if (step < min)
{
min=step;
cout << min << endl;
for(int i=0;i<min;++i)
{
vec[route[i].x][route[i].y]=9;
//cout << route[i].x << " " << route[i].y << endl;
}
}
return ;
&nbs
7fe0
p; }
for(int i=0;i<4;++i)
{
int x=sx+next[i][0];
int y=sy+next[i][1];
if(x<0 || x>11 || y<0 || y>11)
continue;
if(vec[x][y]==0 && book[x][y]==0)
{
//cout << x << "\t" << y << endl;
book[x][y]=1;
route[step].x=x;
route[step].y=y;
dfs(x,y,step+1);
book[x][y]=0;
route[step].x=0;
route[step].y=0;
}
}
}
int main(void)
{
vec=init();
int sx=1;
int sy=0;
vec[sx][sy]=9;
vec[dx][dy]=0;
show(vec);
cout << "############################" << endl;
dfs(sx,sy,0);
show(vec);
}
###########################################################
运行结果:
20
1 1 1 1 1 1 1 1 1 1 1 1
9 9 9 9 0 0 0 1 0 0 0 1
1 1 1 9 1 1 1 1 0 1 0 1
1 0 1 9 1 1 1 1 0 1 0 1
1 0 1 9 0 0 0 0 0 1 0 1
1 0 0 9 0 1 1 1 1 1 1 1
1 1 1 9 0 1 1 1 1 1 0 1
1 0 0 9 9 9 9 9 9 0 0 1
1 1 1 1 1 0 1 1 9 1 1 1
1 0 0 0 0 0 1 1 9 1 1 1
1 0 0 0 1 0 0 1 9 9 9 9
1 1 1 1 1 1 1 1 1 1 1 1
相关文章推荐
- C++ FAQ Lite[8]--引用(更新)
- 开发工具大比拚之Visual C++ vs. Delphi(三)
- 开发工具大比拚之Visual C++ vs. Delphi(二)
- 开发工具大比拚之Visual C++ vs. Delphi(一)
- Byte杂志C++调查报告
- 对今年内将出版的几本C++书的简评
- VC不是梦想,C++需要自由的心
- C++之父B. Stroustrup近期言论
- 用纯粹的C++编写COM组件
- C++中建立对象间消息连接的一种系统方法
- 在Delphi与C++之间实现函数与对象共享
- C/C++的思索 C++之父访谈录 [上帝的玩笑吗?]
- 突破C++的虚拟指针--C++程序的缓冲区溢出攻击
- C++: BIG5到GB
- 浅谈C++中运算符重载
- C++ FAQ Lite[13]--算符重载(新)
- C++ FAQ Lite[7]--类和对象(更新)
- C++ FAQ Lite[17]--异常和错误处理(更新)
- C++ FAQ Lite[9]--内联函数(更新)