嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元微信扫码支付:2 元
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
使用MFC递归回溯解决解决N皇后问题
| 
					 
  | 
			
	
	
当找到一种正确的解法时,棋子由绿色变为红色
	
	
	
	
 LARGE_INTEGER StartTime, EndTime, tc;  //计时器
 _RunningTime->m_CostTimeRecur = 0;
 CString Time;
 if (QueenNumber < 16)
 {
 ResultArray = new int[QueenNumber];
 //记录开始时间
 QueryPerformanceFrequency(&tc);//检索性能计数器的频率。
 QueryPerformanceCounter(&StartTime);//开始时间
 //递归回溯法
 int Row = 0;
 _RunningTime->Recall(QueenNumber, Row, _RunningTime->ResultArray);
 //结束时间
 QueryPerformanceCounter(&EndTime);
 //时间消耗
 _RunningTime->m_CostTimeRecur = (EndTime.QuadPart - StartTime.QuadPart)*1.0 / tc.QuadPart;
 //显示
 Time.Format(_T("%lf s"),m_CostTimeRecur);
 m_RecurTimeShow.SetWindowText(Time.GetBuffer());
 AfxMessageBox(TEXT("递归回溯法运行结束"));
 }
 else
 {
 AfxMessageBox(TEXT("耗时过长, 不计算"));
 }
}
BOOL CRunningTime::IsQueenPlace(int row, int col, int *ResultArray)
{
 for (int i = 0; i < row; i  )
 {
 if ((col == ResultArray[i]) || (abs(row - i) == abs(col - ResultArray[i])))   //如果同列或者对角线
 {
 return FALSE;
 }
 }
 return TRUE;
}
void  CRunningTime::Recall(int n, int row, int *ResultArray)
{
 if (row >= n)
 {
 Count  ;
 return;
 }
 else
 {
 for (int j = 0; j < n; j  )
 { 
 if (IsQueenPlace(row, j, ResultArray))
 {    //如果在row行i列放置不产生冲突
 ResultArray[row] = j;   //记录下列值
 Recall(n, row   1, ResultArray); //到下一行放置下一个皇后
 }
 }
 }