帮忙看一个关于八皇后的一个程序解决思路
帮忙看一个关于八皇后的一个程序
小弟是一新手,看到一个八皇后的程序,实在是看不懂,望高手注释一下:
#include <iostream.h>
class queen
{
public:
queen(int,queen*);
bool findSolution();
bool advance();
void print();
private:
int row;
const int column;
queen *neighbor;
bool canAttack(int,int);
};
queen::queen(int col,queen *ngh)
:column(col),neighbor(ngh)
{
row=1;
}
bool queen::canAttack(int testRow,int testColumn)
{
if (row==testRow)
return true;
int columnDifference=testColumn-column;
if ((row+columnDifference==testRow)||(row-columnDifference==testRow))
return true;
return neighbor&&neighbor-> canAttack(testRow,testColumn);
}
bool queen::findSolution()
{
while (neighbor&&neighbor-> canAttack(row,column))
if (!advance())
return false;
return true;
}
bool queen::advance()
{
if(row <8){
row++;
return findSolution();}
if (neighbor&&!neighbor-> advance())
return false;
row=1;
return findSolution();
}
void queen::print()
{
if(neighbor)
neighbor-> print();
cout < < "( " < <row < < " , " < <column < < ") " < < '\n ';
}
void main()
{
queen *lastQueen=0;
for (int i=1;i <=8;i++){
lastQueen=new queen(i,lastQueen);
if (!lastQueen-> findSolution())
cout < < "no solution\n ";
}
lastQueen-> print();
}
特别是其中关于neighbor的理解,其中两次出现(neighbor&&neighbor-> canAttack(row,column))这样的语句,其目的是什么?
------解决方案--------------------
neighbor&&neighbor-> canAttack(testRow,testColumn);
他把8王后弄成个链,这个就是递归判断当放下(testRow,testColumn)王后时,以前已经放下的王后有没有可能袭击到这个刚放下的(testRow,testColumn) 王后。
其实相当于
if ( neighbor == NULL ) return false
else return neighbor-> canAttack(testRow,testColumn);
小弟是一新手,看到一个八皇后的程序,实在是看不懂,望高手注释一下:
#include <iostream.h>
class queen
{
public:
queen(int,queen*);
bool findSolution();
bool advance();
void print();
private:
int row;
const int column;
queen *neighbor;
bool canAttack(int,int);
};
queen::queen(int col,queen *ngh)
:column(col),neighbor(ngh)
{
row=1;
}
bool queen::canAttack(int testRow,int testColumn)
{
if (row==testRow)
return true;
int columnDifference=testColumn-column;
if ((row+columnDifference==testRow)||(row-columnDifference==testRow))
return true;
return neighbor&&neighbor-> canAttack(testRow,testColumn);
}
bool queen::findSolution()
{
while (neighbor&&neighbor-> canAttack(row,column))
if (!advance())
return false;
return true;
}
bool queen::advance()
{
if(row <8){
row++;
return findSolution();}
if (neighbor&&!neighbor-> advance())
return false;
row=1;
return findSolution();
}
void queen::print()
{
if(neighbor)
neighbor-> print();
cout < < "( " < <row < < " , " < <column < < ") " < < '\n ';
}
void main()
{
queen *lastQueen=0;
for (int i=1;i <=8;i++){
lastQueen=new queen(i,lastQueen);
if (!lastQueen-> findSolution())
cout < < "no solution\n ";
}
lastQueen-> print();
}
特别是其中关于neighbor的理解,其中两次出现(neighbor&&neighbor-> canAttack(row,column))这样的语句,其目的是什么?
------解决方案--------------------
neighbor&&neighbor-> canAttack(testRow,testColumn);
他把8王后弄成个链,这个就是递归判断当放下(testRow,testColumn)王后时,以前已经放下的王后有没有可能袭击到这个刚放下的(testRow,testColumn) 王后。
其实相当于
if ( neighbor == NULL ) return false
else return neighbor-> canAttack(testRow,testColumn);