八皇后问题
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;
}
任何一个皇后所处的"行","列"以及"对角线"上都不能有其它的皇后.
以下是程序体
#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;
}