N皇后问题

来源:互联网 发布:正在安装软件更新 编辑:程序博客网 时间:2024/05/23 02:24
<pre name="code" class="cpp"><img src="http://img.blog.csdn.net/20140721213852764?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg5OTAwNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

/*在一个N*N的国际象棋棋盘上放置N个皇后使得每个皇后不会互相攻击,计算出其所有的可能解分析:因为每个皇后的攻击范围是其所在的行和列以及对角线,所以,将每个皇后独立放在一行,使得皇后在行上面不会被攻击, 接下来只需要确保每行不被攻击即可,因此设置一个含N个元素的数组来放置每个皇后的所在的列,通过判断之前的皇后的攻击范围来确定当前位置是否可放置 */ #include <stdio.h>#include <string.h>#define N 100int search(int cur,int C[],int *tot,int n){int i,j;if(cur==n){(*tot)++;printf("Case %d:\n",*tot);for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(C[i]==j){printf("1,");}else printf("0,");}printf("\n");}}else for(i=0;i<n;i++){int ok=1;C[cur]=i;for(j=0;j<cur;j++){if(C[cur]==C[j]||cur-C[cur]==j-C[j]||cur+C[cur]==j+C[j]){ok=0;break;}}if(ok)search(cur+1,C,tot,n);}return 0;}int main(){int n;int tot;int C[N];while(scanf("%d",&n)==1){tot=0;memset(C,0,sizeof(C)); search(0,C,&tot,n);printf("%d\n",tot);}return 0;}


0 0
原创粉丝点击