基础算法之搜索算法

深度搜索和广度搜索是我们搜索算法中常用的一种思想

4-1 油田合并问题

   问题描述 :

        大致思想:给一幅油田地图,算出油田中可以至少需要几个泵,相连的油田中的油可以相互流动

  输入地图 m*n (<=50)

   然后给出数据

  输出泵的个数

源代码:

#include<stdio.h>
#define N 50
char Map[N][N];
int Flag[N][N];
   int m,n;
void dfs(int i,int j)
{
	//四个方向搜索
	//判断边界
if(i<0||i>=m||j<0||j>=n)return ;
Flag[i][j]=1;//遍历了

if(Flag[i-1][j]==0&&Map[i-1][j]=='@')dfs(i-1,j);
if(Flag[i+1][j]==0&&Map[i+1][j]=='@')dfs(i+1,j);
if(Flag[i][j-1]==0&&Map[i][j-1]=='@')dfs(i,j-1);
if(Flag[i][j+1]==0&&Map[i][j+1]=='@')dfs(i,j+1);

	
}

int main()
{
   int i,j,ans;
   while(scanf("%d%d",&m,&n)!=EOF)
   {
	   //初始化
	       getchar();
	       for(i=0;i<m;i++)
		   {
			   for(j=0;j<n;j++)
		   {
			   Flag[i][j]=0;
			   scanf("%c",&Map[i][j]);
		   }
			   getchar();
		   }
            ans=0;

		   for(i=0;i<m;i++)3
			   for(j=0;j<n;j++)
			   {
				   if(Flag[i][j]==0&&Map[i][j]=='@')
				   {
					   ans++;
					   dfs(i,j);
				   }
			   }
			   printf("%d\n",ans);
     

   }

	return 0;
}

4-2新连连看

 问题描述:

       许多人都玩过连连看的游戏,今天玩一个类似的游戏,在一个10*10大小的小方格组成的矩形中有n(n《10)对字符,他们是大写字母中的前n个,矩形里有些位置可以从上面走过有些则不能,能走过的位置用.来标记,不能的用#来标记,如果两个相同的字符是联通的,从一个字符能走到另一个字符,注意只能从上下左右走,某个位置有其他字符的时候是不能走通的,那么这对字符能够进行配对,如果这对字符匹配成功,则从矩形中消失,也就是说这个位置可以变的走动了

        现在的问题是请你决定这些字符的配对的顺序(只有能配对的才进行配对)使得n对字符最后都配对成功

输入:

    先给出一个正整数,表示有t组测试数据

    每组有10行 每行有10个字符这些字符只能是. #和大写字符组成

输出:

    若每组测试数据中的n对字符可以配对成功,输出配对顺序,如果有多种配对成功的顺序,请输出字典中顺序最小的那组

   否则输出 MyGod

4-3八数码问题

原文地址:https://www.cnblogs.com/OneDream/p/3000866.html