标签:name syn dfs pac amp color mes 成功 names
每个皇后的攻击范围为它所在的这一横排,这一竖排,以它为中心的两条对角线
要求求出每一行每一列都有棋子,且相互攻击不到的摆法,输出字典序前三种满足条件的答案,每一个答案一次输出棋盘每一行棋子所在的列
思路:典型的dfs搜索题。从第一行第一列开始,遍历完该行的每一列,对于每一列,判断是否可走,若可走,dfs下一行,dfs递归的出口是判断是否到了最后一行,若到了则走成功,记录一次
#include<bits/stdc++.h> using namespace std; int n; int ans[14]; int cnt; int col[100], dig1[100], dig2[100]; void myPrint(){ cnt++; if(cnt <= 3){ for(int i=1; i<=n; i++) cout << ans[i] << " "; cout << endl; } } void dfs(int r){ if(r > n){ myPrint(); return; } for(int i=1; i<=n; i++){ if( !col[i] && !dig1[r-i+n] && !dig2[r+i] ){ ans[r] = i; col[i] = 1; dig1[r-i+n] = 1; dig2[r+i] = 1; dfs(r+1); col[i] = 0; dig1[r-i+n] = 0; dig2[r+i] = 0; } } } int main(){ ios::sync_with_stdio(1); cin >> n; dfs(1); cout << cnt; return 0; }
标签:name syn dfs pac amp color mes 成功 names
原文地址:https://www.cnblogs.com/ssNiper/p/11253292.html