8皇后问题的两种解法。

无聊写写N皇后,一个是东软的时候写的,一个是昨天意林大神提醒写的位运算:

东软版记忆深度优先搜索:

#include <stdio.h>

#define MAX 200
#define Empty 0
#define Full 1
#define N 8

unsigned char qipan[N][N][N]={MAX};//初始化8张棋盘表示每下一步的
void input(int i);
int count = 0;

int main()
{
    input(0);
    getchar();
    return 0;
}
void input(int i)
{
    int x=0,y=0;
    int p=0,q=0;
    int flag = 0;
    //初始化当前棋盘
    if(i!=0)
    {
        for(x=0;x<N;x++)
        {
            for(y=0;y<N;y++)
            {
                qipan[i][x][y] = qipan[i-1][x][y];
            }
        }
    }
    else
    {
        for(x=0;x<N;x++)
        {
            for(y=0;y<N;y++)
            {
                qipan[i][x][y] = MAX;
            }
        }
    }
    //递归结束
    if(i==N)
    {
        count++;
        for(x=0;x<N;x++)
        {
            for(y=0;y<N;y++)
            {
                printf("%d ",qipan[i-1][x][y]);
            }
            printf("\n");
        }
        printf("%d\n",count);
        return;
    }
    
    for(y=0;y<N;y++)
    {
        //找到空位
        if(qipan[i][i][y]==MAX)
        {
            //另其为1
            qipan[i][i][y] = 1;
            //前后左右上下都置为0
            for(p=0;p<N;p++)
            {
                for(q=0;q<N;q++)
                {
                    if(q==y||p==i||(p-i)==(q-y)||(p-i)==(y-q))
                        if(qipan[i][p][q] == MAX)
                            qipan[i][p][q] = 0;
                }
            }
            if(flag != -1)
            {
                //找下一个
                input(i+1);
            }
            //将棋盘变回本层原样
            for(p=0;p<N;p++)
            {
                for(q=0;q<N;q++)
                {
                    if(i!=0)
                    qipan[i][p][q] = qipan[i-1][p][q];
                    else
                    qipan[i][p][q] = MAX;
                }
            }
            flag =0;
        }
    }
    //找不到空位结束
    return;
}

 

位运算:

 1 #include <iostream>
 2 int limit = 1;
 3 int sum = 0;
 4 void getnext(int col,int ld,int rd)
 5 {
 6     int t = limit&~(col|ld|rd);          //limit限制位数,col为列上不能安放的位置,ld为左斜角不能安放的位置,rd为右斜角不能安放的位置
 7     if(col == limit)
 8     {
 9         sum ++;
10         return;
11     }
12     while (t)
13     {
14         int x = t&-t;                //这里一定要用&,自己写的时候忘记了用|,结果杯具了,用途是去到x的最右边的1.
15         getnext(col|x,(ld|x)<<1,(rd|x)>>1);
16         t = t-x;
17     }
18 }
19 int main()
20 {
21     int N = 0;
22     int map = 0;
23     scanf("%d",&N);
24     limit = (1<<N) -1;
25     getnext(0,0,0);
26     printf("%d",sum);
27     getchar();
28     getchar();
29     return 0;
30 }

 

 

posted @ 2013-03-19 16:11  chengzheqiao  阅读(794)  评论(0编辑  收藏  举报