B N皇后問題

2022-03-05 11:24:24 字數 1622 閱讀 8473

一天課下,張老闆研究起了西洋棋,渴望完美的他更改了棋盤的大小,在n*n的方格棋盤放置了n個皇后,希望它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上) 

張老闆把這個艱鉅的任務交給了你,對於給定的n,求出有多少種合法的放置方法。 

input共有若干行,每行乙個正整數n≤10,表示棋盤和皇后的數量;如果n=0,表示結束。output共有若干行,每行乙個正整數,表示對應輸入行的皇后的不同放置數量。sample input

185

0

sample output

1

9210

遞迴演算法(低效)

#include#include

int count = 0

;int

t;int notdanger(int row, int j, int (*arr)[10

]) }

//判斷左上方

for( i = row, k = j; i >= 0 && k >= 0; i--, k--)

}//判斷左下方

for( i = row, k = j; i < t && k >= 0; i++, k--)

}//判斷右上方

for( i = row, k = j; i >= 0 && k < t; i--, k++)

}//判斷右下方

for( i = row, k = j; i < t && k < t; i++, k++)

}if(flag1 == 1 || flag2 == 1 || flag3 == 1 || flag4 == 1 || flag5 == 1

)

return0;

else

return1;

}void nqueen(int row, int n, int (*arr)[10

]) }

if(row ==n)

count++;

else

arr2[row][j] = 1

; nqueen(row+1

, n, arr2);}}

}}int

main()

}nqueen(

0, t, arr);

if(count == 0

) printf(

"none\n");

else

printf(

"%d\n

", count);

}return0;

}

回溯演算法

#include#include

intn,tmp;

int map[11

];void dfs(int

k)

else

}if(flag)

dfs(k+1

); }

}}int

main()

while(scanf("

%d",&m),m)

return0;

}

view code

B N皇后問題

在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如果n 0,表示結束。output 共有若...

問題 B N的階乘

求高精度乘於低精度的方法,如下所示,d陣列最好開大點,至於n的階乘,就初始化從1開始累積乘,進行吸收即可,記得初始化第乙個數字1,即結果,至少為1,高精度的乘法即把 乘數 當成乙個整體,不斷的乘,進製,接著進行必要的剩下的數的儲存,用while 搞精度乘法必須把 乘數當成乙個整體!和加法基本上是一致...

問題 I n皇后問題

在n n 格的棋盤上放置彼此不受攻擊的n 個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在n n格的棋盤上放置n個皇后,任何2 個皇后不放在同一行或同一列或同一斜線上。設計乙個解n 後問題的佇列式分支限界法,計算在n n個方格上放置彼此不受攻擊的n個皇...