深度优先便利:
给定整数a1到an,选出若干数和为k。
思路是判断每个数加或者不加,然后深度搜下去。
int a[MAX_N];
int n,k;
bool dfs(int i,int sum){//已经走到了节点i,和为sum,然后向后分支。
//推出循环的条件
if(i==n) return sum==k;
//不加a[i]的情况
if(dfs(i+1,sum))return true;
//加上a[i]的情况
if(dfs(i+1,sum+a[i])) return true;
return false;
}
void solve()
{
if(dfs(0,0)) printf("Yes\n");
else printf("No\n");
}
POJ2396
#include<iostream>
#include<cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAX_N 100
#define MAX_M 100
int N,M;
char field[MAX_N[MAX_M+1];
void dfs(int x,int y){
filed[x][y]='.';
for(int dx=-1;dx<=1;dx++){
for(int dy=-1;dy<=1;dy++){
int nx=x+dx,ny=y+dy;
if(0<=nx&&nx<N&&0<=ny&&ny<M&&field[nx][ny]=='W')dfs(nx,ny);
}
}
return ;
}
void solve(){
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++;
}
}
}
printf("%d\n",res);
}