[关闭]
@Moritz 2019-04-07T11:43:29.000000Z 字数 782 阅读 547

八皇后问题的优化

洛谷 DFS 优化 C++ 所有文稿


洛谷oj

最开始的做法

  1. #include <iostream>
  2. #include <cmath>
  3. #include <string>
  4. #include <string.h>
  5. #include <set>
  6. using namespace std;
  7. int n,a[15],cnt=0,b[15],c[15];
  8. set<string> se;
  9. void solve(int cur){
  10. if (cur>n){
  11. cnt++;
  12. if(cnt<=3){
  13. bool sp=false;
  14. for(int i=1;i<=n;i++){
  15. if(sp) cout<<" ";
  16. else sp=true;
  17. cout<<a[i];
  18. }
  19. cout<<endl;
  20. }
  21. return;
  22. }
  23. for(int i=1;i<=n;i++){
  24. bool ok=true;
  25. for(int j=1;j<cur;j++) {if (a[j]==i||b[j]==cur-i||c[j]==cur+i) {ok=false;break;}}
  26. if(ok){
  27. a[cur]=i;
  28. b[cur]=cur-i;
  29. c[cur]=cur+i;
  30. solve(cur+1);
  31. }
  32. }
  33. }
  34. int main(){
  35. cin>>n;
  36. solve(1);
  37. cout<<cnt;
  38. return 0;
  39. }

然而最后一个案例n=13超时了,回溯部分稍加修改:

  1. for(int i=1;i<=n;i++){
  2. bool ok=true;
  3. for(int j=1;j<cur;j++) {if (a[j]==i||b[cur-i+n]||c[cur+i]) {ok=false;break;}}
  4. if(ok){
  5. a[cur]=i;
  6. b[cur-i+n]=true;
  7. c[cur+i]=true;
  8. solve(cur+1);
  9. b[cur-i+n]=false;
  10. c[cur+i]=false;
  11. }
  12. }

直觉上并没有感觉会差多远,但是修改过后确实全部AC了


2019.4.1

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注