<pre name="code" class="cpp">#include <iostream>
using namespace std ;
int total = 0 ;
//判断row行line列是否可以放皇后
bool isCan(int row , int line , int chess[8][8])
{
int i , j ;
//判断同列中是否有皇后
for( i = 0 ; i < 8 ; i++)
{
if(chess[i][line] == 1)
{
return false ;
}
}
//判断左上是否有皇后
for( i = row , j = line ; i >= 0 && j >= 0 ; i-- , j--)
{
if(chess[i][j] == 1)
{
return false ;
}
}
//判断右上是否有皇后
for( i = row , j = line ; i >= 0 && j < 8 ; i-- , j++)
{
if(chess[i][j] == 1)
{
return false ;
}
}
//判断左下是否有皇后
for( i = row , j = line ; i < 8 && j >= 0 ; i++ , j--)
{
if(chess[i][j] == 1)
{
return false ;
}
}
//判断右下是否有皇后
for( i = row , j = line ; i < 8 && j < 8 ; i++ , j++)
{
if(chess[i][j] == 1)
{
return false ;
}
}
return true ;
}
//row表示从0行开始递归到最后一行
//line是8列
void Eightqueen( int row , int line , int chess[8][8])
{
int chessCopy[8][8] , i , j ; //复制出一个新的棋盘
for( i= 0 ; i < 8 ; i++)
{
for( j = 0 ; j < 8 ; j++)
{
chessCopy[i][j] = chess[i][j] ;
}
}
if( row == 8) //如果每行都放了一个皇后
{
total++ ;
cout << "第" << total << "中方案:" << endl ;
for( i = 0 ; i < 8 ; i++)
{
for( j = 0 ; j < 8 ; j++)
{
cout << chess[i][j] << " " ;
}
cout << endl ;
}
cout << endl ;
}
else
{
for(i = 0 ; i < 8 ; i++) //从每行的第一个各自开始放
{
if(isCan( row , i , chessCopy))//如果该格可以放
{
for(j=0 ; j < i ; j++) //清除以前放过的皇后
{
chessCopy[row][j] = 0 ;
}
chessCopy[row][i] = 1 ;
Eightqueen(row+1 , line , chessCopy) ;// 去下一行里寻找
}
}
}
}
int main()
{
int chess[8][8] , i , j ;
for( i = 0 ; i < 8 ; i++)
{
for( j = 0 ; j < 8 ; j++)
{
chess[i][j] = 0 ;
}
}
Eightqueen( 0 , 8 , chess) ;
return 0;
}
用递归枚举实现八皇后问题
最新推荐文章于 2022-05-21 23:30:02 发布