首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于一个八皇后的程序,该如何解决

2012-02-17 
关于一个八皇后的程序这是我在网上看到的八皇后问题的代码,请问大家,第一次无论怎样放都不满足条件的情况

关于一个八皇后的程序
这是我在网上看到的八皇后问题的代码,请问大家,第一次无论怎样放都不满足条件的情况是不是出现在棋盘的第六行.如果是,程序跳转到哪里了.

#include   "stdio.h "
/*
数组a[I]:a   [I]表示第I个皇后放置的列;I的范围:1..8;


对角线数组:b[j](主对角线),c[j](从对角线),根据程序的运行,去决定主从对角线是否放入皇后;
*/

static   char   Queen[8][8];


static   int   a[8];//


static   int   b[15];


static   int   c[15];


static   int   iQueenNum=0;     //记录总的棋盘状态数


void   qu(int   i);     //参数i代表行


int   main()


{
       
        int   iLine,iColumn;
       
        //棋盘初始化,空格为*,放置皇后的地方为@
       
       
        for(iLine=0;iLine <8;iLine++)
       
       
        {
                a[iLine]=0;     //列标记初始化,表示无列冲突
               
               
                for(iColumn=0;iColumn <8;iColumn++)
               
               
                Queen[iLine][iColumn]= '* ';
               
               
        }
        //主、从对角线标记初始化,表示没有冲突
       
       
        for(iLine=0;iLine <15;iLine++)
       
       
        b[iLine]=c[iLine]=0;
       
        qu(0);
       
       
        return   0;
       
       
}


void   qu(int   i)//i为当前处理的行


{
       
       
        int   iColumn;
       
       
        for(iColumn=0;iColumn <8;iColumn++)
        {
                if(a[iColumn]==0&&b[i-iColumn+7]==0&&c[i+iColumn]==0)   //如果无冲突
                {
                        Queen[i][iColumn]= '@ ';   //放皇后
a[iColumn]=1;       //标记,下一次该列上不能放皇后
                        b[i-iColumn+7]=1;     //标记,下一次该主对角线上不能放皇后
                        c[i+iColumn]=1;       //标记,下一次该从对角线上不能放皇后
                     
if(i <7)  
qu(i+1);     //如果行还没有遍历完,进入下一行

else           //否则输出


                        {
                                //输出棋盘状态
                                int   iLine,iColumn;
                                printf( "第%d种状态为:\n ",++iQueenNum);
for(iLine=0;iLine <8;iLine++)
{
                                        for(iColumn=0;iColumn <8;iColumn++)
printf( "%c     ",Queen[iLine][iColumn]);
                                        printf( "\n ");
                                }
                                printf( "\n\n ");
                            //     getchar();   加上这句可以一个结果一个结果地看
                          }//else   end
                       
                       
                        //如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置
                       
                       
                        Queen[i][iColumn]= '* ';
                       
                       
                        a[iColumn]=0;
                       
                       
                        b[i-iColumn+7]=0;
                       
                       
                        c[i+iColumn]=0;
                       
                       
                }//   if   ends
               
               
        }
       
       
}


[解决办法]
“是不是出现在棋盘的第六行”这个不重要



//如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置

就是说无解时,退回到上一行重新选择一个位置

热点排行
Bad Request.