題目大意:
經典的八皇后問題,即在一個8*8的棋盤上放8個皇后,使得這8個皇后無法互相攻擊( 任意2個皇后不能處於同一行,同一列或是對角線上),輸出所有可能的擺放情況。
基本思路:
用一維數組存儲,下標代表行,元素存儲列的編號,在編程時只需比較列以及對角線是否符合規則即可,判斷對角線是否符合規則時注意絕對值;下面是最簡單的遞歸算法;
代碼如下:
#include <iostream>using namespace std;
int c[20],n=8,cnt=0;
void print()
{
for(int i=0; i<n; ++i)
{
for(int j=0; j<n; ++j)
{
if(j == c[i]) cout<<"1 ";
else cout<<"0 ";
}
cout<<endl;
}
cout<<endl;
}
void search(int r)
{
if(r == n)
{
print();
++cnt;
return;
}
for(int i=0; i<n; ++i)//循環這一點要掌握
{
c[r] = i;//放在循環裏保證第r+1個皇后嘗試每一種可能;
int ok = 1;
for(int j=0; j<r; ++j)//判斷跟之前的皇后是否有衝突;
if(c[r]==c[j] || r-j==c[r]-c[j] || r-j==c[j]-c[r])
{
ok = 0;
break;
}
if(ok) search(r+1);
}
}
int main()
{
search(0);
cout<<cnt<<endl;
return 0;
}