回 帖 发 新 帖 刷新版面

主题:我自己写的求N皇后 比较短吧

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<math.h>
#define MAX 100
int pos[MAX]={0};//位置
int n=4;//n为四代表四皇后,为八代表八皇后
void Display(){
    int i,j;
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++)
            if(pos[i]==j) printf("* ");
            else printf("0 ");
            printf("\n");
    }
    printf("\n");
}
int OK(int i,int j){//判断布局合法
    int k,flag;
    flag=1;
    for(k=1;k<i;k++)
        if(pos[k]==j||abs(j-pos[k])==abs(i-k)) {
            flag=0;
            break;
        }
    return flag;    
}
void Trial(int i,int n){
    int j;
    if(i>n) Display();
    for(j=1;j<=n;j++)
        if(OK(i,j)) {pos[i]=j;Trial(i+1,n);pos[i]=0;}
}
int main(){
    Trial(1,n);
    return 0;
}

回复列表 (共9个回复)

沙发

四皇后
0 * 0 0
0 0 0 *
* 0 0 0
0 0 * 0

0 0 * 0
* 0 0 0
0 0 0 *
0 * 0 0

六皇后
0 * 0 0 0 0
0 0 0 * 0 0
0 0 0 0 0 *
* 0 0 0 0 0
0 0 * 0 0 0
0 0 0 0 * 0

0 0 * 0 0 0
0 0 0 0 0 *
0 * 0 0 0 0
0 0 0 0 * 0
* 0 0 0 0 0
0 0 0 * 0 0

0 0 0 * 0 0
* 0 0 0 0 0
0 0 0 0 * 0
0 * 0 0 0 0
0 0 0 0 0 *
0 0 * 0 0 0

0 0 0 0 * 0
0 0 * 0 0 0
* 0 0 0 0 0
0 0 0 0 0 *
0 0 0 * 0 0
0 * 0 0 0 0

Press any key to continue

板凳

可以压在一个函数里,这样就很短了。
判重用数组就可以了,写函数判断效率不高。

3 楼

建立在boolean型可以用int型表示基础上的不严密程序
ok函数应该用boolean写吧

4 楼

今天的我写的
#include<stdio.h>
#include<windows.h>
#define MAX 100
int x[MAX];
int OK(int pos,int n){
    int i;
    for(i=1;i<=n-1;i++)
        if(x[i]==pos||pos-x[i]==n-i||pos-x[i]==i-n)
            return 0;
        return 1;
}
void Output(int n){
    int i,j;
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++)
            if(j==x[i]) printf("*");
            else printf("&");
        printf("\n");
    }
    printf("\n");
}
void NQueen(int n){
    int i;
    x[1]=0;
    i=1;
    while(i>0){
            x[i]=x[i]+1;
            while(x[i]<=n&&!OK(x[i],i))//剪枝
                x[i]=x[i]+1;
            if(x[i]<=n){
                if(i==n)
                    Output(n);
                if(i<n){//放下一个
                    i=i+1;
                    x[i]=0;
                }
            }
            else i=i-1;
    }
}
int main(){
    int n;
    long tstart,tend;
    while(1){
        scanf("%d",&n);
        tstart=GetTickCount();
        NQueen(n);
        tend=GetTickCount();
        printf("Time is %ldms\n",tend-tstart);
    }
    return 0;
}

5 楼

8皇后的数据与时间   Time is 125ms

&&&&*&&&
&&&&&&*&
&*&&&&&&
&&&&&*&&
&&*&&&&&
*&&&&&&&
&&&*&&&&
&&&&&&&*

&&&&*&&&
&&&&&&*&
&*&&&&&&
&&&&&*&&
&&*&&&&&
*&&&&&&&
&&&&&&&*
&&&*&&&&

太多了,删除了一些





Time is 125ms

6 楼

time is 110ms
time is 110ms
time is 110ms
time is 110ms



0 0 0 0 0 0 0 *
0 0 0 * 0 0 0 0
* 0 0 0 0 0 0 0
0 0 * 0 0 0 0 0
0 0 0 0 0 * 0 0
0 * 0 0 0 0 0 0
0 0 0 0 0 0 * 0
0 0 0 0 * 0 0 0

time is 110ms

7 楼

自己顶个

8 楼

我也来顶一个
真的很好!!!!!
你真强啊!!
佩服!!!!

9 楼

那个运行的时间怎么算啊,我相知道哪个算法啊

我来回复

您尚未登录,请登录后再回复。点此登录或注册