B3625迷宫寻路
1.本题不是求路径,而是判断是否有路,所以不能用回溯法(会超时de),用洪水填充法即可
void dfs(int x,int y){
if(x==n&&y==m){
flag=true;
cout<<"Yes"<<endl;
exit(0);
}
vis[x][y]=1;
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<1||ny<1||nx>n||ny>m) continue;
if(vis[nx][ny]) continue;
if(z[nx][ny]=='#') continue;
dfs(nx,ny);
}
}
exit(0)是退出程序,用return 不能AC
PS:二者的区别:
exit(0):正常运行程序并退出程序;
return():返回函数。如果它在main函数中,它将退出函数并返回一个值。
vis:标记路径
dfs后面没有清空标记
2.判断起始点是否是空地
if(z[1][1]=='#') cout<<"No"<<endl;
3.dfs是void类型,不是int(::>_<:: )
P1460健康的荷斯坦奶牛
1.先定义一个check数组,判断喂的维他命是否够了
bool check(int cnt){
for(int i=1;i<=v;i++){
int sum=0;
for(int j=1;j<=cnt;j++){
sum+=si[save[j]][i];
}
if(sum<need[i]) return false;
}
return true;
}
注意定义sum的位置
2.深度优先搜索:当确定第k步时,说明k-1步已经确定了
void dfs(int k){
if(mi<=(k-1)||(k-1)>g) return;
if(check(k-1)){
mi=min(mi,k-1);
for(int i=1;i<=mi;i++){
ans[i]=save[i];//将save数组中的值赋到ans数组中
}
return;
}
int s=save[k-1];//为了避免重复,所以下一次应从上一次的下一位开始
for(int i=s+1;i<=g;i++){
save[k]=i;
dfs(k+1);
}
}