回 帖 发 新 帖 刷新版面

主题:[讨论]八皇后小问题

#include<iostream>
#include<iomanip>
#define EIGHT 8
#define TRUE 1
#define FALSE 0
using namespace std;
int queen[EIGHT];//存放8个皇后位置
int number=0;//计算解的总数
int attack(int ,int );
void print_table()//输出解 
{
     int x=0,y=0;
     number+=1;
     cout<<endl;
     cout<<"八皇后的第"<<setw(2)<<number<<"组解"<<endl<<"\t";
     for(x=0;x<EIGHT;x++)
     {
        for(y=0;y<EIGHT;y++)
           if(x==queen[y])
           cout<<"<q>";
           else
           cout<<"<->";
        cout<<endl<<"\t";
     }
     system("pause"); 
 }
void  decide_position(int value)
{
      int i=0;
      while(i<EIGHT)
      {
            if(attack(i,value)!=1)//判断是否受到攻击 
            {
                     queen[value]=i;
                     if(value==7)
                       print_table();
                      else
                      decide_position(value+1);             
            }
            i++;       
      }
}
int attack(int row,int col)
{
    int i=0,atk=FALSE;
    int offset_row=0,offset_col=0;
    while((atk!=1) && i<col)
    {
           offset_row=abs(i-col);
           offset_col=abs(queen[i]-row);//判断皇后位置 
           if(queen[i]==row || offset_row==offset_col)//判断位置时应该是行,列,对角线,但这里少么了
              atk=TRUE;                              //一个,是不是程序的思想与我想的不一样啊
           i++;                                       //我还是不懂啊。。求指教  
    }
    return atk;
}
int main()
{
    decide_position(0);
    return 0;
}
这是关于八皇后的完整代码。。。我刚学,也存在了一点问题想请教。[em4][em4]

回复列表 (共2个回复)

沙发

程序的确和lz想的不一样,个人粗略地看了下。分析下这段代码:
while((atk!=1) && i<col)       //i所表示的应该是已得到的皇后位置所在列,i < col,这说明已经 列相同构成的攻击不成立了。
{
    offset_row=abs(i-col);
    offset_col=abs(queen[i]-row);
    if(queen[i]==row || offset_row==offset_col) //前者是行相同攻击,后者才是对角线。。
    {
        atk=TRUE;  
    }                          
    i++;                                         
}

板凳

我明白了 谢谢

我来回复

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