zoukankan      html  css  js  c++  java
  • 简单的BFS学习笔记

    什么是BFS传送门

    今天学习BFS,加油!

    先定义个数组:

    struct Node{
    		int a=0;
    		int b=0;
    		int step=0;
    };
    int map[5][4]={//地图
                   0,0,3,2,//2是终点  3是山,不能走
                   0,0,0,0,//求从(0,0)出发到2位置的最短路径
                   0,0,3,0,
                   0,3,0,0,
                   0,0,0,3,     
    };

    Node queue[25];  //队列

     BFS关键的是队列。

    下面写个函数用于入队操作:

    int rudui(int a,int b)//入队 
    {
    	if(a>=5 || a<0 || b>=4 || b<0 )
    	{
    		return 0;
    	}
    	//边界控制 
    	if(book[a][b]==0 && map[a][b]!=3)//可以入队 
    	{
    		queue[tail].a=a;
    		queue[tail].b=b;
    		queue[tail].step=queue[head].step+1;
    		
    		book[a][b]=1;//标记下 不能走了
    		tail++;
    	}
    	
    	if(map[a][b]==2)
    	{
    		return 1;
    	}
    	
    	return 0;
    }
    

    有了以上工具,我们开始工作:

    int main()
    {
    	while(head<tail)
    	{
    		if( rudui(queue[head].a+1,queue[head].b) ||   //走上 
    		    rudui(queue[head].a,queue[head].b+1) ||  //走右 
    		    rudui(queue[head].a-1,queue[head].b) ||  //走下 
    		    rudui(queue[head].a,queue[head].b-1) )	//走左		                                              
    		{
    			cout<<"findOK"<<" "<<queue[tail-1].step;	//输出路径	
    			return 0;
    		}
    		else{
    			head++;
    			
    		}
    	}
    
    	return 0;
    }
    

      OK了。

    下面给出完整代码:

    #include<iostream>
    //#include<queue>
    #include<math.h>
    using namespace std;
    struct Node{
    		int a=0;
    		int b=0;
    		int step=0;
    };
    int map[5][4]={
                   0,0,3,2,
                   0,0,0,0,
                   0,0,3,0,
                   0,3,0,0,
                   0,0,0,3,          
    };
    
    int book[5][4]={0};
    
    Node queue[25];   
    
    int head=0,tail=1;
    int rudui(int a,int b)//入队 
    {
    	if(a>=5 || a<0 || b>=4 || b<0 )
    	{
    		return 0;
    	}
    	//边界控制 
    	if(book[a][b]==0 && map[a][b]!=3)//可以入队 
    	{
    		queue[tail].a=a;
    		queue[tail].b=b;
    		queue[tail].step=queue[head].step+1;
    		
    		book[a][b]=1;//标记下 不能走了
    		tail++;
    	}
    	
    	if(map[a][b]==2)
    	{
    		return 1;
    	}
    	
    	return 0;
    }
    
    int main()
    {
    	while(head<tail)
    	{
    		if( rudui(queue[head].a+1,queue[head].b) ||   //走上 
    		    rudui(queue[head].a,queue[head].b+1) ||  //走右 
    		    rudui(queue[head].a-1,queue[head].b) ||  //走下 
    		    rudui(queue[head].a,queue[head].b-1) )	//走左		                                              
    		{
    			cout<<"findOK"<<" "<<queue[tail-1].step;	//输出路径	
    			return 0;
    		}
    		else{
    			head++;
    			
    		}
    	}
    
    	return 0;
    }
    

      

     2015-03-24 15:47:29

  • 相关阅读:
    洛谷 [P1024]一元三次方程求解
    洛谷 [P1426] 通往奥格瑞玛的道路
    洛谷 [p1439] 最长公共子序列 (NlogN)
    洛谷 [P1182] 数列分段
    洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)
    洛谷 [P1280] 尼克的任务
    洛谷 [P1801] 黑匣子
    洛谷 [p1196] 银河英雄传说
    洛谷 [P2024] 食物链
    洛谷 [P1198] 最大数
  • 原文地址:https://www.cnblogs.com/sundy-lee/p/4362960.html
Copyright © 2011-2022 走看看