【Tai_mount】算法学习 - 搜索 - DFS
DFS即深度优先搜索
板子
//Dfs板子
void dfs(int x){
if(x>n){solve();return;}
for(int i=1;i<=n;++i) if(check(x,i)){
arr[x]=i; book(x,i,true);
dfs(x+1);
book(x,i,false);
}
return;
}
题目
luoguP2392 kkksc03考前临时抱佛脚
//https://www.luogu.com.cn/problem/P2392
#include<iostream>
using namespace std;
const int N=30;
int s[5],sum[5],ans;
int tim[5][N],maxx[5],thesum;
void ciin(){
for(int i=1;i<=4;i++) cin>>s[i];
for(int i=1;i<=4;i++) for(int j=1;j<=s[i];j++){
cin>>tim[i][j];
sum[i]+=tim[i][j];
}
}
bool check(int sub,int x,int i){
if(sum[sub]/2<thesum+i*tim[sub][x]) return false;
return true;
}
void book(int a){
thesum+=a;
return;
}
void solve(int sub){
if(maxx[sub]==0||maxx[sub]<thesum) maxx[sub]=thesum;
}
void dfs(int sub,int x){
if(x>s[sub]){solve(sub);return;}
for(int i=0;i<=1;i++)if(check(sub,x,i)){
book(i*tim[sub][x]);
dfs(sub,x+1);
book(-i*tim[sub][x]);
}
return;
}
int main(){
ciin();
for(int i=1;i<=4;i++){
dfs(i,1);
ans+=sum[i]-maxx[i];
}
cout<<ans;
return 0;
}
luoguP1219 [USACO1.5]八皇后 Checker Challenge
//https://www.luogu.com.cn/problem/P1219
#include<iostream>
using namespace std;
const int M=20;
int n,arr[M],cnt;
bool a[M],b[M],c[M];
void ciin(){
cin>>n;
}
void solve(){
cnt++;
if(cnt<=3){
for(int i=1;i<=n;i++){
cout<<arr[i]<<' ';
}
cout<<'\n';
}
}
bool check(int x,int i){
if(a[i]||b[i+x]||c[20+i-x]){return false;}
return true;
}
bool book(int x,int i,bool tf){
a[i]=tf;b[i+x]=tf;c[20+i-x]=tf;
}
void dfs(int x){
if(x>n){solve();return;}
for(int i=1;i<=n;i++) if(check(x,i)){
arr[x]=i; book(x,i,true);
dfs(x+1);
book(x,i,false);
}
}
int main(){
ciin();
dfs(1);
cout<<cnt;
return 0;
}

浙公网安备 33010602011771号