dfs与bfs(1)
来源:互联网 发布:十堰房产每日成交数据 编辑:程序博客网 时间:2024/05/22 13:40
最基础的迷宫题,以后我会添一些难一点的题,毕竟我也是小白,边学边写。
找女朋友
题目描述 :
X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。
4
-1
dfs
#include<stdio.h>
#include<string.h>
int mv[16][16];
char map[16][16];
int mx[4]={-1,0,1,0};
int my[4]={0,-1,0,1};
int min;
struct B
{
int x,y,ans;
};
/*DFS开始*/
void dfs(int x,int y,int n,int m,int ans)
{
int i;
if(ans>=min) //先前已定min为一个很大值,所以比他大则根本不能成立
return ;
if(ans<min&&map[x][y]=='Y'){ //找到终点且符合条件
min=ans;
return ;
}
struct B t;
for(i=0;i<4;i++) //四个方向遍历
{
t.x=x+mx[i];
t.y=y+my[i];
if(0<=t.x&&t.x<n&&0<=t.y&&t.y<m&&mv[t.x][t.y]==0&&map[t.x][t.y]!='#'){ //点没越界且该点未访问且该点可到达
mv[t.x][t.y]=1; //标为已访问
dfs(t.x,t.y,n,m,ans+1); //答案步数加一,此处会一直循环知道不成立或到达终点为止
mv[t.x][t.y]=0; //重新设为未访问,回溯(因为前面的dfs已经到头,所以慢慢回溯把访问过的点一点一点清空)
}
}
}
int main()
{
int i,j,n,m;
while(~scanf("%d %d",&n,&m)){
for(i=0;i<n;i++)
scanf("%s",map[i]); //打印每行代码
memset(mv,0,sizeof(mv)); //访问点清零
min=300; //min是很大值
for(i=0;i<n;i++) //找到起始点,同时若这一行没有跳出列循环,重新进入下一行
{
for(j=0;j<m;j++)
if(map[i][j]=='X')
break;
if(j!=m)break;
}
dfs(i,j,n,m,0); //从起始点开始
min==300?printf("-1\n"):printf("%d\n",min); //若答案仍未很大值,说明无解
}
return 0;
}
bfs(仍不是太懂,用栈写的,以后熟练使用队列)
#include<stdio.h>
#include<string.h>
int mv[16][16];
char map[16][16];
int mx[4]={-1,0,1,0};
int my[4]={0,-1,0,1};
struct B
{
int x,y,ans;
}q[300],t,f; //q,t,f为相同类型
int main()
{
int i,j,n,m,flag,s,e;
while(~scanf("%d %d",&n,&m)){
for(i=0;i<n;i++)
scanf("%s",map[i]); //输入行代码
memset(mv,0,sizeof(mv)); //访问点清零
for(i=0;i<n;i++) //同理,找到起始点
{
for(j=0;j<m;j++)
if(map[i][j]=='X')
break;
if(j!=m)break;
}//BFS开始
s=flag=e=0;
t.x=i,t.y=j,t.ans=0; //将点的位置和此时移动步数记录下来(用t来存)
q[e++]=t;//进栈,q[0]已为起始点
mv[t.x][t.y]=1; //起始点已访问
while(s<e){ //当点还没空的时候(每进一个点s就加)
t=q[s++];//出栈(也就是把q给了t,后面来判断t)
if(map[t.x][t.y]=='Y'){ //先判断是否已经找到,这样就不用莫名其妙多判一次
printf("%d\n",t.ans);
flag=1; //标记
break;
}
for(i=0;i<4;i++)
{
f.x=t.x+mx[i];
f.y=t.y+my[i]; //新的f为t的下一个点
if(0<=f.x&&f.x<n&&0<=f.y&&f.y<m&&mv[f.x][f.y]==0&&map[f.x][f.y]!='#'){//判断
f.ans=t.ans+1; //步数加一
q[e++]=f; //进站(将新的f点进站,重新给q)
mv[f.x][f.y]=1; //标为已访问
}
}
}
if(flag==0)printf("-1\n"); //若点已清空(即队列中已无点),仍然没有遇到标记,则为不可能
}
return 0;
}
- dfs与bfs(1)
- BFS 与 DFS
- bfs与dfs
- DFS与BFS
- DFS与BFS
- dfs与bfs实现
- bfs与dfs
- 【图】BFS与DFS
- BFS与DFS总结
- bfs与dfs
- DFS与BFS
- dfs与bfs
- dfs与bfs
- BFS与DFS
- DFS 与 BFS
- DFS与BFS
- BFS与DFS
- BFS与DFS
- nginx模块之ngx_http_proxy_module
- QT+MSVC2010编译32位ORACLE OCI驱动
- IO多路复用的网络通信
- STM32 FOC BLDC与PMSM的区别
- 百度地图简要demo--关键字查询,点定位
- dfs与bfs(1)
- Ubuntu16.04系统中配置ParaviewWeb5.3+Apache2
- 求字符串中的“最长重复子串”
- nginx入门级配置案例
- 多线程下双重检查锁的问题及解决方法
- JAVA集合知识点汇总<一> List集合
- 软中断知识
- 5. Longest Palindromic Substring
- python入门(三十八):自定义线程池