N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5846 Accepted Submission(s): 2651
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
这题是回溯问题,但是回溯的上一层的值,属于深度搜索dfs,附加两张图,好理解一点
/* #include <stdio.h>//超时,,见鬼了 #include<string.h> int count,n,k; int vis[25][25]; void dfs(int cur) { int i; if(cur==n) count++; else for(i=0;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() { while(scanf("%d",&n)&&n) { memset(vis,0,sizeof(vis)); count=0; dfs(0); printf("%d ",count); } return 0; } */ //果断打表; #include<stdio.h> int main() { int num[10]={1,0,0,2,10,4,40,92,352,724}; int n; while(scanf("%d",&n),n) { printf("%d ",num[n-1]); } return 0; }
虽然超时了,但函数本身亦有可取之处,需要慢慢理解,好吧,打表的孩子伤不起啊,,,
有更新哦!!!
(当时年轻不懂事!现在回过来看看。15MS过)
#include <stdio.h> #include<string.h> int count,n,k; int vis[3][25]; void dfs(int cur,int m) { int i; if(cur==m) count++; else for(i=0;i<m;i++) { if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+m]) { vis[0][i]=vis[1][cur+i]=vis[2][cur-i+m]=1; dfs(cur+1,m); vis[0][i]=vis[1][cur+i]=vis[2][cur-i+m]=0; } } } int main() { int num[11]; //={1,0,0,2,10,4,40,92,352,724}; for(int i=1;i<=10;i++) { memset(vis,0,sizeof(vis)); count=0; dfs(0,i); num[i]=count; } while(scanf("%d",&n),n) { printf("%d ",num[n]); } return 0; }