| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 387 人关注过本帖
标题:自己用C语言写的解决8皇后问题的程序,帮忙看看有什么需要改善
只看楼主 加入收藏
cracker134
Rank: 2
等 级:等待验证会员
帖 子:18
专家分:13
注 册:2010-6-15
收藏
 问题点数:0 回复次数:0 
自己用C语言写的解决8皇后问题的程序,帮忙看看有什么需要改善
8皇后问题,在8*8的国际象棋盘上,排列8个皇后,使其各自不能相互攻击。即横向,纵向,斜向不能存在皇后。问共有多少种排列?

#include<stdio.h>
int test(int y0,int y1,int y2,int y3,int y4,int y5,int y6,int y7);
void printx(int y);
void main()
{
 
   int i,y[8],ctr[8],num=0;
//因横向各不同,所以x轴定为1,2,3...,8,下面计算y的排列方法,也要各个不同

    for(ctr[0]=1;ctr[0]<9;ctr[0]++)
    {y[0]=ctr[0];

    for(ctr[1]=1;ctr[1]<9;ctr[1]++)
    {if(ctr[1]==ctr[0]){continue;}
    y[1]=ctr[1];

    for(ctr[2]=1;ctr[2]<9;ctr[2]++)
    {if((ctr[2]==ctr[0])||(ctr[2]==ctr[1])){continue;}
    y[2]=ctr[2];

    for(ctr[3]=1;ctr[3]<9;ctr[3]++)
    {if((ctr[3]==ctr[0])||(ctr[3]==ctr[1])||(ctr[3]==ctr[2])){continue;}
    y[3]=ctr[3];

    for(ctr[4]=1;ctr[4]<9;ctr[4]++)
    {if((ctr[4]==ctr[0])||(ctr[4]==ctr[1])||(ctr[4]==ctr[2])||(ctr[4]==ctr[3])){continue;}
    y[4]=ctr[4];

    for(ctr[5]=1;ctr[5]<9;ctr[5]++)
    {if((ctr[5]==ctr[0])||(ctr[5]==ctr[1])||(ctr[5]==ctr[2])||(ctr[5]==ctr[3])||(ctr[5]==ctr[4])){continue;}
    y[5]=ctr[5];

    for(ctr[6]=1;ctr[6]<9;ctr[6]++)
    {if((ctr[6]==ctr[0])||(ctr[6]==ctr[1])||(ctr[6]==ctr[2])||(ctr[6]==ctr[3])||(ctr[6]==ctr[4])||(ctr[6]==ctr[5])){continue;}
    y[6]=ctr[6];

    for(ctr[7]=1;ctr[7]<9;ctr[7]++)
    {if((ctr[7]==ctr[0])||(ctr[7]==ctr[1])||(ctr[7]==ctr[2])||(ctr[7]==ctr[3])||(ctr[7]==ctr[4])||(ctr[7]==ctr[5])||(ctr[7]==ctr[6])){continue;}
    y[7]=ctr[7];

    if (test(y[0],y[1],y[2],y[3],y[4],y[5],y[6],y[7])==1)
    {num+=1;
    printf("[%3d]:\n",num);

        for(i=0;i<8;i++)
        {printx(y[i]);}

        getchar();  //敲击enter键输出
    }
   
    }}}}}}}}

    printf("ALL:%d\n",num);
}
//test函数测试斜向是否有皇后。若没有,则为一种正确排列,因为前面已经把横向纵向问题解决
int test(int y0,int y1,int y2,int y3,int y4,int y5,int y6,int y7)
{
    int cmp,flag=0,y[8];

    y[0]=y0;y[1]=y1;y[2]=y2;y[3]=y3;y[4]=y4;y[5]=y5;y[6]=y6;y[7]=y7;

    for(cmp=1;cmp<8;cmp++)
    {if(((y[0]+cmp-0)==y[cmp])||((y[0]-(cmp-0))==y[cmp])){flag=1;break;}}

    if(flag==0)
    {
    for(cmp=2;cmp<8;cmp++)
    {if(((y[1]+cmp-1)==y[cmp])||((y[1]-(cmp-1))==y[cmp])){flag=1;break;}}
    }

    if(flag==0)
    {
    for(cmp=3;cmp<8;cmp++)
    {if(((y[2]+cmp-2)==y[cmp])||((y[2]-(cmp-2))==y[cmp])){flag=1;break;}}
    }

    if(flag==0)
    {
    for(cmp=4;cmp<8;cmp++)
    {if(((y[3]+cmp-3)==y[cmp])||((y[3]-(cmp-3))==y[cmp])){flag=1;break;}}
    }

    if(flag==0)
    {
    for(cmp=5;cmp<8;cmp++)
    {if(((y[4]+cmp-4)==y[cmp])||((y[4]-(cmp-4))==y[cmp])){flag=1;break;}}
    }

    if(flag==0)
    {
    for(cmp=6;cmp<8;cmp++)
    {if(((y[5]+cmp-5)==y[cmp])||((y[5]-(cmp-5))==y[cmp])){flag=1;break;}}
    }

    if(flag==0)
    {
    cmp=7;
    if(((y[6]+cmp-6)==y[cmp])||((y[6]-(cmp-6))==y[cmp])){flag=1;}
    }

    if (flag==0){return 1;}
    else {return 0;}

}

void printx(int temp)
{
    switch(temp)
    {
    case 1:
        printf("X O O O O O O O\n");break;
    case 2:
        printf("O X O O O O O O\n");break;
    case 3:
        printf("O O X O O O O O\n");break;
    case 4:
        printf("O O O X O O O O\n");break;
    case 5:
        printf("O O O O X O O O\n");break;
    case 6:
        printf("O O O O O X O O\n");break;
    case 7:
        printf("O O O O O O X O\n");break;
    case 8:
        printf("O O O O O O O X\n");break;
    default:
        printf("\n");
    }
}
搜索更多相关主题的帖子: C语言 皇后 改善 
2010-06-15 14:45
快速回复:自己用C语言写的解决8皇后问题的程序,帮忙看看有什么需要改善
数据加载中...
 
   



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

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