深度遍历
题一、给定整数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;
}