zoukankan      html  css  js  c++  java
  • 深度优先搜索初尝试-DFS-LakeCounting POJ No.2386

    DFS入门的一道经典题目:LakeCounting
    用栈或队列来实现:

    #include<cstdio>
    #include<stdlib.h>
    #include<iostream>
    #include<stack>
    using namespace std;
    
    int n,m;
    int pla[10][3]={{1,0},{1,1},{1,-1},{-1,-1},{-1,0},{-1,1},{0,-1},{0,1}};//对坐标进行移动的向量
    
    struct place
    {
    	int x,y;
    };//用结构体表示坐标
    
    char a[105][105];
    
    //核心部分DFS
    void DFS(int i,int j)
    {
    	place begin,between;
    	stack<place>s;//stack的类型是坐标place
    	begin.x=i;
    	begin.y=j;//从(i,j)开始搜索
    	
    	s.push(begin);//存入s
    	
    	while(!s.empty())//为空搜索结束
    	{
    		begin=s.top();//提出栈顶进行搜索
    		s.pop();
    
    		for(i=0;i<8;i++)
    		{
    			between.x=begin.x+pla[i][0];
    			between.y=begin.y+pla[i][1];//加上坐标 
    			
    			if(between.x>=0 && between.x<=n && between.y>=0 && between.y<=m && a[between.x][between.y]=='W')//在草地的范围内且是水
    			{
    				s.push(between);//入栈
    				a[between.x][between.y]='.';//改成‘.’防止重复判断 
    			}
    		}
    		
    	}
    	
    }
    int main()
    {
    	int i,j,k,t=0,sum=0;
    	
    	scanf("%d%d",&n,&m);
    	getchar(); 
    	
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=m;j++)
    		{
    			scanf("%c",&a[i][j]);
    		}
    		
    		getchar();
    	}
    	
    	for(i=1;i<=n;i++)
    	{
    		for(j=1;j<=m;j++)
    		{
    			if(a[i][j]=='W')
    			{
    				DFS(i,j);
    				sum++;//调用几次DFS即是水潭的个数
    			}
    		}
    	}
    	
    	printf("%d
    ",sum);
    	
    	return 0;
    }
    

    用栈来实现深度优先搜索。
    大概的思路我用伪代码来解释:

    伪代码:
    void DFS(传入刚开始坐标)
    {
           stack<坐标>s;
           坐标begin,between.
           begin存刚刚开始的坐标;
           begin入栈;
    
           while(s不为空)//s为空时停止搜索
           {
                 坐标begin=栈顶坐标;
                 栈顶坐标出栈,开始搜索。
                 for(遍历八个搜索向量)
                 {
                       begin+搜索向量;
                       if(此时搜索到了水坑)
                       {
                              begin+搜索向量入栈(即此时搜索到的坐标);
                              被搜索到的这个坐标标记为土地;
                        }
                  }
    
            }
    }
    

    2016/3/10

  • 相关阅读:
    服务器使用ssh秘钥登录并禁止密码登录
    c# @符号后面对双引号(")转义
    unity EditorWindow拖入文件或文件夹
    unity 生成GUID
    unity 将对象始终放在鼠标位置和指定的相机z轴位置
    unity 打开指定路径文件夹
    unity UTF8格式加载和保存xml
    VsCode 手动配置omnisharp、.NET Core Debugger、razor
    Maya 保存场景时UV和UV集丢失
    进程通信机制
  • 原文地址:https://www.cnblogs.com/qq952693358/p/5261168.html
Copyright © 2011-2022 走看看