zoukankan      html  css  js  c++  java
  • 深入优先算法

    今天使用深入搜索算法,搜算关于一个水坑的问题。好久没有认真看看C++的书,在该问题上发现自己还有很多地方不熟悉了。

    比如C++中数组的传递应该写成 void dfs(int x,int y,char(&field)[N][M]) 其中[]的优先级比&要高,所以之前传值传递不行。
    1. #include <iostream>
      using namespace std;
      
      #define N 10
      #define M 12
      
      
      //首先第一步将当前的地方设置为'.',其次检查所有的其他的地方看是不是符合要求,并进行递归调用
      void dfs(int x,int y,char (&field)[N][M]){
      
      	field[x][y] = '.';
      
      	for (int i = -1; i < 2; ++i)
      	{
      		for (int j = -1; j < 2; ++j)
      		{
      			int nx=x+i,ny=y+j;
      			if (0<=nx && nx <N && 0<=ny && ny<M && (field[nx][ny] == 'W') )
      			{
      				dfs(nx,ny,field);
      			}
      		}
      	}
      
      }
      
      int main(int argc, char const *argv[])
      {
      
      	char field[N][M] = {
      		{'W','.','.','.','.','.','.','.','.','W','W','.'},
      		{'.','W','W','W','.','.','.','.','.','W','W','W'},
      		{'.','.','.','.','W','W','.','.','.','W','W','.'},
      		{'.','.','.','.','.','.','.','.','.','W','.','.'},
      		{'.','.','.','.','.','.','.','.','.','W','W','.'},
      		{'.','.','.','.','.','.','.','.','.','.','W','.'},
      		{'W','W','.','.','.','.','.','.','.','W','W','.'},
      		{'W','.','.','.','.','.','.','.','.','.','.','W'},
      		{'W','W','.','.','.','.','.','.','.','.','W','.'},
      		{'.','W','.','.','.','.','.','.','.','.','.','W'}
      	};
      
      	int res = 0;
      	for (int i = 0; i < N; ++i)
      	{
      		for (int j = 0; j < M; ++j)
      		{
      			if (field[i][j]=='W')
      			{
      				dfs(i,j,field);
      				res++;
      			}
      		}
      	}
      	cout<<res<<endl;
      
      
      
      	cout<<"gfs is over!"<<endl;
      	return 0;
      }
      

        

     
    另外的一种写法是:将field数组声明为全局变量:externchar field[N][M]
    1. #include <iostream>
      using namespace std;
      
      #define N 10
      #define M 12
      
      extern char field[N][M] = {
      		{'W','.','.','.','.','.','.','.','.','W','W','.'},
      		{'.','W','W','W','.','.','.','.','.','W','W','W'},
      		{'.','.','.','.','W','W','.','.','.','W','W','.'},
      		{'.','.','.','.','.','.','.','.','.','W','.','.'},
      		{'.','.','.','.','.','.','.','.','.','W','W','.'},
      		{'.','.','.','.','.','.','.','.','.','.','W','.'},
      		{'W','W','.','.','.','.','.','.','.','W','W','.'},
      		{'W','.','.','.','.','.','.','.','.','.','.','W'},
      		{'W','W','.','.','.','.','.','.','.','.','W','.'},
      		{'.','W','.','.','.','.','.','.','.','.','.','W'}
      	};
      
      //首先第一步将当前的地方设置为'.',其次检查所有的其他的地方看是不是符合要求,并进行递归调用
      void dfs(int x,int y){
      
      	field[x][y] = '.';
      
      	for (int i = -1; i < 2; ++i)
      	{
      		for (int j = -1; j < 2; ++j)
      		{
      			int nx=x+i,ny=y+j;
      			if (0<=nx && nx <N && 0<=ny && ny<M && (field[nx][ny] == 'W') )
      			{
      				dfs(nx,ny);
      			}
      		}
      	}
      
      }
      int main(int argc, char const *argv[])
      {
      	int res = 0;
      	for (int i = 0; i < N; ++i)
      	{
      		for (int j = 0; j < M; ++j)
      		{
      			if (field[i][j]=='W')
      			{
      				dfs(i,j);
      				res++;
      			}
      		}
      	}
      	cout<<res<<endl;
      
      	cout<<"gfs is over!"<<endl;
      	return 0;
      }
      

        


    今天是第一天真正的开始思考关于算法的知识,现在在算法上面还是属于超级小白的阶段,但是好好加油,相信总有一天会更加的优秀的!



  • 相关阅读:
    A Color Game
    《算法分析》作业1
    The 2018 ACM-ICPC CCPC NING XIA G-Factories
    2017北京ICPC Pangu and Stones(区间DP)
    Comet OJ
    2019牛客多校训练营第四场补题
    2019牛客多校训练营第五场补题
    2017CCPC哈尔滨 B:K-th Number(二分+尺取)
    启发式分治入门 Non-boring sequences UVA
    2019牛客多校训练营第三场补题
  • 原文地址:https://www.cnblogs.com/clifff/p/5026639.html
Copyright © 2011-2022 走看看