| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 401 人关注过本帖
标题:自己编的八皇后问题仅供参考
只看楼主 加入收藏
C_戴忠意
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:575
专家分:1349
注 册:2011-10-21
结帖率:100%
收藏
 问题点数:0 回复次数:2 
自己编的八皇后问题仅供参考
程序代码:
#include <stdio.h>

#define MAX 8
#define NUM 100000

int arr[MAX][MAX];
int result[NUM][MAX];

int tmp[MAX];

int res;

void init()
{
    int i,j;
    for(i=0;i<MAX;i++)
    {
        for(j=0;j<MAX;j++) arr[i][j]=0;
        tmp[i]=-1;
    }
    res=0;
}

void Attack(int x,int y,int inc)
{
    int i,j;
    for(i=0;i<MAX;i++) arr[i][y]+=inc;
    for(i=0;i<MAX;i++) arr[x][i]+=inc;
    for(i=x,j=y;i<MAX&&j<MAX;i++,j++) arr[i][j]+=inc;
    for(i=x,j=y;i>=0&&j>=0;i--,j--) arr[i][j]+=inc;
    for(i=x,j=y;i<MAX&&j>=0;i++,j--) arr[i][j]+=inc;
    for(i=x,j=y;i>=0&&j<MAX;i--,j++) arr[i][j]+=inc;
   

    arr[x][y]-=5*inc;
}

void Queen(int layer)
{
    int i;
    if(layer==MAX)
    {
        for(i=0;i<MAX;i++)
        {
            result[res][i]=tmp[i];
        }
        res++;
        return;
    }
    for(i=0;i<MAX;i++)
    {
        if(arr[layer][i]) continue;
        Attack(layer,i,1);
        tmp[layer]=i;
        Queen(layer+1);
        Attack(layer,i,-1);
        tmp[layer]=-1;
    }
}

int main()
{
    int i,j;
    init();
    Queen(0);
    for(i=0;i<res;i++)
    {
        for(j=0;j<MAX;j++) printf("%d ",result[i][j]);
        printf("\n");
    }
    printf("%d\n",res);
    return 0;
}



[ 本帖最后由 C_戴忠意 于 2012-4-16 21:06 编辑 ]
搜索更多相关主题的帖子: 皇后 问题 
2012-04-16 20:15
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
程序代码:
include<stdio.h>
void fun(int i,int j);
static b[8][8];
void main()
    {
    fun(0,0);

    }
int knock(int i,int j)
        {int temp_i,temp_j,k;
        temp_i=i;temp_j=j;
        for(i=i-1;i>=0;i--)
            if(b[i][j]==1)
                return 1;
         for(i=temp_i-1,k=temp_j+1,j=temp_j-1;i>=0;i--,j--,k++)
                {if(j>=0&&b[i][j]==1)
                    return 1;
                if(k<8&&b[i][k]==1)
                    return 1;
                }
        return 0;
        }
void cls(int i)
        {int j;
        for(;i<8;i++)
            {
            for(j=0;j<8;j++)
                b[i][j]=0;
            }

        }
void print(void)
        {int i,j;static int n=1;
         printf("--------------------------\n第%d种\n",n++);
            for(j=0;j<8;j++)
                {
                for(i=0;i<8;i++)
                    {if(b[i][j]==1)
                        printf("* ");
                     else
                        printf("0 ");
                    }
                printf("\n");
            
                }
           printf("\n");//    getchar();
        }
void fun(int i,int j)
        {if(i<8)
            {
            for(;j<8;j++)
                {cls(i);
                if(knock(i,j)==1)
                    continue;
                b[i][j]=1;     
                fun(i+1,0);
                }
            
            }
        else
            print();
        }

人得一生得奋斗!
2012-04-16 23:21
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <math.h>
#define X 8
#define Y 8

void copychess(int tempchess[X][Y],int chess[X][Y])
{
    int i,j;
    for(i=0;i<X;i++)
        for(j=0;j<Y;j++)
            tempchess[i][j]=chess[i][j];
}

void checkchess(int tempchess[X][Y],int x,int y)
{
    int i,j;
    for(i=0;i<X;i++)
    {
        for(j=0;j<Y;j++)
        {
            if( (abs(i-x)==abs(j-y) || i==x || j==y) && tempchess[i][j]==0)
                tempchess[i][j]=1;
        }
    }
    tempchess[x][y]=2;
}

printchess(int chess[X][Y])
{
    int i,j;
    static int count=1;
    printf("%d:\n",count++);
    for(i=0;i<X;i++)
    {
        for(j=0;j<Y;j++)
            if (chess[i][j]==2)
                printf("Q ");
            else
                printf("- ");
        printf("\n");
    }
    printf("***********************\n");
}


void EQ(int chess[X][Y],int x)
{
    int y,tempchess[X][Y]; 
    for(y=0;y<Y;y++)
    {
        copychess(tempchess,chess);
         if(tempchess[x][y]==0)
         {
             tempchess[x][y]=2;
             if (x==X-1)
             {
                 printchess(tempchess);
                 return;
             }
             checkchess(tempchess,x,y);
             EQ(tempchess,x+1);
          }
    }
}

main()
{
    int chess[X][Y]={0}; 
    EQ(chess,0);
    getche();
}
我也来一个,今天下午正好看到这道题。

[ 本帖最后由 share32 于 2012-4-18 11:04 编辑 ]
2012-04-17 22:32
快速回复:自己编的八皇后问题仅供参考
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022885 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved