#include #include #include #include #include #include #include #include using namespace std;
int n = 12;
bool backtrace(int &k, set&col, set&diag45, set&diag135, bool &success, vector&placecol);
void queenslv(bool &success, const int stepvegas);
int main()
}finish = clock();
//迴圈執行1000次成功的時間
duration = (double)(finish - start) / clocks_per_sec;
cout << "n = " << setw(3) << setiosflags(ios::left) << n;
cout << " stepvegas = " << setw(3) << setiosflags(ios::left) << stepvegas;
cout << " fail times = " << setw(6) << setiosflags(ios::left) << failcnt;
cout << " spend time = " << setw(6) << setiosflags(ios::left) << duration << " s" << endl;
}cout << endl;
n++;
}return 0;
}bool backtrace(int &k, set&col, set&diag45, set&diag135, bool &success, vector&placecol)
i++;
}if (i > n)
}//回溯結束條件
if (k == n + 1)
success = true;
else
success = false;
return success;
}void queenslv(bool &success, const int stepvegas)
}if (nb > 0)
else if (nb == 0)
}if (nb > 0 || stepvegas == 0)//stepvegas為0,純回溯或者隨機放置stepvegas行的皇后之後採用回溯法放置接下來的皇后。
else
success = false;
return;
}
比如19個皇后問題,演算法時間對比,stepvegas=0,表示純回溯法,可以看到stepvegas等於18時,即隨機放置18個皇后,再採取回溯法,效率是前者的幾百,上千倍,然後同數量級在n/2左右有6,皇后數量越多,概率演算法效率更加凸顯。一般最優 stepvegas不具規律性,但是一般在接近n/2附近,n為皇后數量。
演算法 八皇后問題
問題簡述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在8 8的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n1 n1,而皇后個數也變成n2。而且僅當...
演算法 八皇后問題
問題描述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在8 8的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當n 1...
演算法 八皇后問題
created by xiaoyu on 2019 10 6.include include using namespace std const int n 8 int board n n int tot 0 int valid int x,int y for int i 0 i x i retur...