嗯... 忽然想到... 多加一個去除同樣的迴圈, 應該就可以加速了
也就是, 上面那個遞迴函式改為:
void Queen (int i)
{
int j ;
if ( i < Q )
for (rows[i]=0 ; rows[i] < Q ; ) // 這兒不遞加, 由新增loop 決定
{
Queen (i+1);
rows[i]++ ; // 原本上層迴圈最後+1 搬到這兒
for ( j=0 ; j < i ; j++ ) // 增加檢查是否已經跟以前重複的迴圈
if ( rows[j] == rows[i] ) // 如果已經重複,
rows[i]++ ; // 則直接跳過該值, 換下一個
}
else if (valid(rows))
printAnswer(rows);
}
多加一個loop決定下一次要try 的數值
這樣子, 理論上程式執行時間, 應該變成上一個的約... 1/8 時間
而且, 這種程式要遞迴模式才可以寫
不然每層迴圈內都要加一層這種code, 程式會看得眼花撩亂, 呵
Acute.