B3621 DFS 元组类
signed main() { cin >> n >> k; dfs(0); return 0; }
!!!错误:
void dfs(int i){//已经放了i个数
if(i == n){//若放满i元
for(int j=1;j<=n;j++){
cout<<a[j]<<' ';
}
cout<<'\n';
return;
}
else {
//若没放满,则继续放下一元
for(int j=1;j<=k;j++){
i++;
a[i]=j;
dfs(i); //!!!dfs后没有回溯,会导致i一直++
}
}
}
解决方案1:
void dfs(int i){//已经放了i个数
if(i == n){//若放满i元
for(int j=1;j<=n;j++){
cout<<a[j]<<' ';
}
cout<<'\n';
return;
}
else {
//若没放满,则继续放下一元
for(int j=1;j<=k;j++){
i++;
a[i]=j;
dfs(i);
i--;//回溯i
a[i]=0;//回溯输出数组
}
}
}
解决方案2:
void dfs(int i){//已经放了i个数
if(i == n){//若放满i元
for(int j=1;j<=n;j++){
cout<<a[j]<<' ';
}
cout<<'\n';
return;
}
else {
//若没放满,则继续放下一元
for(int j=1;j<=k;j++){
a[i+1]=j;//直接在里面++不会影响i的值
dfs(i+1);
a[i+1]=0;//对应的只需要回溯输出数组的值
}
}
}
复杂度的分析: 原理就是再最开始的dfs(0)时,有n种可能,在 n 种可能里的每一种都有 n 种可能,这样有k^n的复杂度 每一个状态都是独立的