用回溯法法解决八皇后问题

//回溯:把问题分为若干步骤并递归求解时,如果当前步骤没有合法选择,则函数将返回上一级递归调用, 
//八皇后问题
//C[i]存的是第i行的皇后放在哪一列 
 void search(int cur)
 {
     int i, j;
     if(cur == n) tot++;  //递归边界,已经放完,如果能够运行到这里即说明全部皇后已经放完了 
     //对每一列枚举 
     else for(i = 0; i < n; i++)
     {
         int ok = 1;
         C[cur] = i;   //尝试把第cur行的皇后放在i列
        //检测与之前cur行的皇后是否冲突 
        for(j = 0;j < cur; j++)
            if(C[cur] == C[j] || cur-C[cur] == j-C[j] || cur+C[cur] == j+C[j])
            {
                ok = 0;
                break;
             }
        if(ok)  search(cur+1);  //如果合法就继续递归 
      } 
}
//因为是逐行放的,所以不用担心会在同一行上,所以只用判断是否在同一列或者在对角线上 
 

你可能感兴趣的:(用回溯法法解决八皇后问题)