算法 N皇后问题

来源:互联网 发布:windows7摄像头软件 编辑:程序博客网 时间:2024/05/17 04:07

题目

在n*n的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。


暴力法:

#include <stdio.h>    #include <math.h>   #define n 8int a[n];//元素值为皇后所在列的位置  int temp,i,j,num;int flag;int count = 0;int main(){    for(num=0; num<pow(n,n); num++){        temp=num;          flag = 1;        for(i=0; i<n; i++){            a[i]=temp%n;            temp=temp/n;        }        for(i=0; i<n; i++){            for(j=i+1; j<n; j++){                //绝对值,判断皇后是否在同行,或者斜线方向                 if(a[i]==a[j] || abs(i-j)==abs(a[i]-a[j]) ){                    flag=0;                    break;                }            }        }        if(flag==1)            count++;    }    printf("%d\n",count);     return 0;}

回溯法:

#include <stdio.h>    #include<math.h>#define n 8int a[n];int count=0;//在第t列是否可放置int ok(int t){    for(int k=0; k<t; k++){        if(a[k]==a[t] || abs(k-t)==abs(a[k]-a[t])){            return 0;        }    }    return 1;}void dfs(int t){    if(t==n)        count++;    else{        for(int i=0; i<n; i++){            a[t]=i;//对于第t行,第i列,放置皇后.            //判断刚才放置的位置是否可行,如果可行,就放置下一行。不可行的话,继续在第t行放置            if(ok(t)){                  dfs(t+1);            }        }    }}int main(){      dfs(0);    printf("%d.\n",count);    return 0;    }    
0 0
原创粉丝点击