N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 25886 Accepted Submission(s): 11504
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1 92 10
思路:用了《算法入门经典》上的两种方法都超时,百度题解才知道用打表过。。。打表真流氓啊。
#include<stdio.h> #include<string.h> #define N 100 int ans,n,vis[3][100],num[11]; void dfs(int cur) { int i; if( cur == n+1) ans ++; else { for(i = 1; i <= n; i ++) { if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])//利用二维数组直接判断 {//该列没有放过棋子&&主对角线没有放过棋子&&副对角线没有放过棋子 vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 1;//修改全局变量 dfs(cur+1); vis[0][i] = vis[1][cur+i] = vis[2][cur-i+n] = 0;//回溯 } } } } int main() { int i,m; for(n = 1; n <= 10; n ++) { ans = 0; memset(vis,0,sizeof(vis)); dfs(1); num[n] = ans; } while(scanf("%d",&m),m!=0) { printf("%d ",num[m]); } return 0; }