N皇后问题是非常经典的一道问题,解题的方法也有很多,非常经典包括暴力回溯法。
DFS就是深度优先搜索的首字母,简单理解就是把所有可能是答案的结果都尝试一遍,用走迷宫来举例子的话就是一条路走到黑,如果走到死路了,再退回上一个分岔口选择另一条路继续一条路走到黑。
属于入门时非常常用的暴力算法,考察的知识点主要是对递归的掌握和理解。递归也是新生入门算法时必经的一道门槛,理解透彻递归,就能明白DFS。
#include<bits/stdc++.h> using namespace std; const int N = 110; char maze[N][N]; //col[]判断该列是否已经有棋子;k[]判断左斜线是否有棋子;p[]判断右斜线是否有棋子 int col[N],k[N],p[N]; int n ; void dfs(int t){ if( t == n+1 ){ for(int i = 1 ; i <= n ; i ++){ for(int j = 1 ; j <= n ; j ++){ cout<<maze[i][j]; } cout<<endl; } cout<<endl; return; } for(int i = 1; i <= n;i++) // 根据斜率公式:y = kx + b //k[]的斜率为1,所以我们判断在同一直线上的点,只需要把k = 1和x,y坐标代入,判断b = y - x是否相等 //同时为了防止数组下标为负数,所以我们增加一个偏移量n,得到了k[n + i - t] //同理,p[]的斜率为-1,所以我们得到b = y + x ------> p[i + t] if(maze[t][i] != ‘Q‘ && col[i] != 1 && k[n+i-t] != 1 && p[t+i] != 1 ){ maze[t][i] = ‘Q‘; col[i] = 1; p[t+i] = 1; k[n-t+i] = 1; dfs(t+1); col[i] = 0; p[t+i] = 0; k[n-t+i] = 0; maze[t][i] = ‘.‘; } } int main(){ cin>>n; for(int i = 1 ; i <= n ; i ++) for(int j = 1 ; j <= n ; j ++){ maze[i][j] = ‘.‘; } dfs(1); return 0; }
原文地址:https://www.cnblogs.com/Flydoggie/p/12299263.html
时间: 2024-10-07 20:51:43