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

<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;
	
} 


 

猜你喜欢

转载自blog.csdn.net/ly1390811049/article/details/50868214
今日推荐