穷竭检索之深度遍历

深度遍历

题一、给定整数a1、a2、... 、an,判断是否可以从中选出若干数,使他们的和恰好为k。

     限制条件

  • 1<= n <= 20
  • -10^8 <= ai <=10^8
  • -10^8 <= k <=10^8

#include <stdio.h>
#include <stdlib.h>

int n,k,a[22],b[22];

//深度遍历 
bool dfs(int i,int sum)
{
	if(i==n)
		return sum==k;
	b[i] == 0;//没加设值为0 
		
	if(dfs(i+1,sum))//值不想加遍历 
		return true;
		
	b[i] = 1;// 相加设值为1 
	
	
	if(dfs(i+1,sum+a[i]))//值相加遍历 
		return true;
	
	
	return false;
 } 
 
 int main(){
 	scanf("%d",&n);
 	scanf("%d",&k);
 	printf("请输入数值:");
 	
 	for(int i=0;i<n;i++)
 		scanf("%d",&a[i]);
 	
 	
 	if(dfs(0,0)){
 		printf("YES\n");
 	
	 	for(int i=0;i<n;i++)
	 	{
	 		if(b[i])
	 		{
	 			printf("%d",a[i]);
	 			printf(" ");
			 }
		 }
		 
		 return 0;
	 }
	 else
	 	printf("NO");
	 	
	return 0;

 }

 

 

题二、有一个大小为NxM的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通是指下图中相对W的*部分)

*  *  *

* W *

*  *  *

限制条件

  • N,M <= 100

样例输入:10  12

W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.

样例输出:

3

#include <stdio.h>
#include <stdlib.h>

int n,m;
char field[100][100];

void init()
{
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++)
		scanf("%s",field[i]);
}


//深度遍历,找到所有有积水的地方进行检索 
void dfs(int x,int y){
	field[x][y] = '.';
	for(int dx = -1;dx <= 1;dx++)//三个选项,-1,0,1 
	{
		for(int dy = -1;dy <= 1;dy++){//三个选项,-1,0,1 
			int nx=x+dx,ny=y+dy;//dx,dy是移动的增量 
			if(nx>=0 && nx<n && ny<m && ny>=0 && field[nx][ny] =='W') dfs(nx,ny);
			//判断nx,ny是不是在园子内,以及是否有积水 
			
		}
	}
} 

void solve(){
    int res = 0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(field[i][j]=='W'){
			//找到‘W’,W是有积水的地方,注意,i和j的值是会变得 
                dfs(i,j);
                res++;
            }
        }
    }
    printf("%d\n",res);
}




int main()
{
	//fopen("input.txt","r",stdin);
	init();
	solve();
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40341131/article/details/81157792