您的位置:首页 > 其它

用递归枚举实现八皇后问题

2016-03-12 22:52 316 查看
<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;

}



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