您的位置:首页 > 其它

八皇后问题

2008-10-03 23:03 169 查看
八皇后问题是:设法在国际象棋的棋盘上放置八个皇后,使得其中

任何一个皇后所处的"行","列"以及"对角线"上都不能有其它的皇后.

以下是程序体

#include<iostream>

using namespace std;

bool a[8]; //a[i]表示第i行是否可以放皇后

bool b[15]; //b[k]表示"从左下往右上"('/')的第k个对角线是否可以放皇后

bool c[15]; //c[k]表示"从左上往右下"('\')的第k个对角线是否可以放皇后

//与棋盘第i行,第j列的格子所对应的行和对角线为:a[i],b[i+j],c[j-i+7]

bool try_by_col(int j,int x[8]); //x[j]表示第j列上皇后的位置(所在的行). )

{ for (int i=0; i<8; i++) //选择第j列中可放皇后的行,然后递归选择第j+1列可放皇后的行....

{ if (a[i] && b[i+j] && c[j-i+7]) //第j列第i行的位置所在的行以及两个对角线上无皇后.

{ x[j] = i; //设置第j列皇后的位置.

a[i] = b[i+j] = c[j-i+7] = false; //把第j列皇后所在的行以及两个对角线设为已占用.

if (j == 7 || try_by_col(j+1)) //是最后一列或第j+1列皇后位置选择成功.

return true;

else //第j+1列皇后位置选择失败.

a[i] = b[i+j] = c[j-i+7] = true; //取消第j列皇后位置,准备选择下一个位置.

}

}

return false;

}

int main()

{ int i,j,k;

//初始化:所有行以及对角线可放皇后.

for (i=0; i<8; i++)

a[i]=true;

for (k=0; k<15; k++)

b[k]=true;

for (k=0; k<15; k++)

c[k]=true;

if (try_by_col(0)) //从第0列开始尝试放皇后的位置.

{ //x[0],x[1],...,x[7]分别为第一列,第二列,...,第七列上皇后的位置(所在的行)

for (j=0; j<8; j++) //按列输出皇后

{ for (i=0; i<8;i++) cout << "|Q|";

for (i=x[j]+1; i<8; i++) cout << "_|";

cout << endl;

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: