蓝桥杯/上机题目 打卡Day1
题目1 AcWing 3429. 全排列
题目2 AcWing 3472. 八皇后
1.AcWing 3429. 全排列
思路: 爆搜问题 核心思路需要了解 u 的含义(个人理解) 这里的iu枚举的是每一个位置
_ _ _ 注意对于具体问题的具体理解
#include<iostream>
#include<cstring>
using namespace std;
const int N = 10;
char str[N] , path[N];
bool st[N];
int n;
void dfs(int u)
{
if(u == n)
{
cout << path << endl;
return;
}else
{
for(int i = 0; i < n; i ++)
{
if(!st[i])
{
path[u] = str[i];
st[i] = true;
dfs(u + 1);
st[i] = false;
}
}
}
}
int main()
{
cin >> str;
n = strlen(str);
dfs(0);
return 0;
}
2.AcWing 3472. 八皇后
思路 : 八皇后实际上是对于 每一行来一次枚举 从而减少了我们暴力搜索的次数
同时 注意行/列/主对角线/副对角线的表示方法 尤其是对于偏移量的理解
#include<iostream>
#include<cstring>
using namespace std;
const int N = 20;
int n;
bool col[N],dg[N],udg[N];
int path[N];
bool dfs(int u){
if(u == 8){
// 这里的n用来对方案的数量进行控制 题目已经明确8*8的八皇后问题有92种的解决方案
// 我们的处理就是通过深搜的方式求出每一种方案数
if(-- n == 0){
for(int i = 0; i < 8; i++){
cout << path[i];
}
cout << endl;
return true;
}
return false;
}
for(int i = 0; i < 8; i ++)
{
if(!col[i] && !dg[u + i] && !udg[u - i + 8])
{
col[i] = dg[u + i] = udg[u - i + 8] = true;
path[u] = i + 1;
if(dfs(u + 1)) return true;
col[i] = dg[u + i] = udg[u - i + 8] = false;
}
}
return false;
}
int main()
{
int t;
cin >> t;
while(t --){
cin >> n;
memset(col, 0, sizeof col);
memset(dg, 0, sizeof dg);
memset(udg, 0, sizeof udg);
dfs(0);
}
return 0;