今天做了两题最基础的穷竭搜索。
1、
其实这一题也可以暴力枚举,穷竭搜索是一样的,只是写成了递归的形式。每一个数只有选和不选两种情况,总共用2^n种情况。
停止的条件是搜索到最后一个数,并且在搜索到最后一个数的时候判断是否和为k。dfs的参数为搜索到第i个数的i,和当前的和是多少sum。
代码:
#include<iostream>
using namespace std;
//深度优先搜索
int n,k;
int a[2000];
bool dfs(int i,int sum)
{
if(i==n)
return sum==k;
if(dfs(i+1,sum+a[i+1]))
return true;
if(dfs(i+1,sum))
return true;
return false;
}
int main()
{
cin>>n;
for(int j=0;j<n;j++)
{
cin>>a[j];
}
cin>>k;
if(dfs(0,0))
cout<<"true"<<endl;
else
cout<<"false"<<endl;
return 0;
}
2、
这题目一开始我没读明白,后来看了解析,深度优先搜索主要运用在搜索积水的时候,算法总体来说我感觉还是一个模拟。先找到第一个积水,然后用深度优先搜索来将他的八连通的部分全部变为“.”,直到八连通的位置全部都变成了“.”,深度优先搜索结束。
然后接着找下一个积水的位置,然后继续深度优先搜索。
进行了多少次深度搜索,则最后有多少个水洼
代码
#include<iostream>
using namespace std;
char pool[105][105];
int n,m;
void dfs(int x,int y)
{
pool[x][y]='.';
int nx,ny;
for(int dx=-1;dx<=1;dx++)
{
for(int dy=-1;dy<=1;dy++)
{
nx=x+dx;
ny=y+dy;
if(nx>=0&&ny>=0&&pool[nx][ny]=='W'&&nx<n&&ny<m)
{
dfs(nx,ny);
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>pool[i][j];
}
}
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(pool[i][j]=='W')
{
dfs(i,j);
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}