acwing
圆桌座位
#include <iostream>
using namespace std;
const int N = 11;
int n, m;
bool g[N][N], st[N]; //g表示朋友关系, st表示人是否使用过的状态
int pos[N]; //每个位置上是谁
int dfs(int u)
{
if (u == n) //n个人已经排满时
{
if (g[pos[n - 1]][pos[0]]) return 0; //判断最后一人是否与第一人为朋友关系
return 1;
}
int res = 0;
for (int i = 1; i <= n; i ++ ) //题干中给出人是从编号1开始的
if (!st[i] && !g[i][pos[u - 1]]) //该人没用过且与前一个人非朋友关系
{
pos[u] = i;
st[i] = true;
res += dfs(u + 1);
st[i] = false; //还原现场
}
return res;
}
int main()
{
cin >> n >> m;
while (m -- )
{
int a, b;
cin >> a >> b;
g[a][b] = g[b][a] = true; //朋友关系初始化
}
pos[0] = 1; //第一个人挂上去
st[1] = true; //第一个人已经用过了
cout << dfs(1) << endl;
return 0;
}
字母
#include <bits/stdc++.h>
using namespace std;
const int N = 30;
char s[N][N];
unordered_map<char , bool> st; //用unordered_map定义st,可以不用把字符转变为ASCII码
int n , m , ans , d[N][N];
void dfs(int x , int y)
{
int dx[4] = {0 , 1 , 0 , -1} , dy[4] ={1 , 0 ,-1 , 0}; // 定义可以走的四个方向
for(int i = 0 ; i < 4 ; i ++)
{
int a = x + dx[i] , b = y + dy[i]; // 将点分别往四个方向上移动
if(a > 0 && b > 0 && a <= m && b <= n && !st[s[a][b]]) //判断要走到的点是否
//出界或者已经走过一样的字母
{
d[a][b] = d[x][y] + 1; //存储走过的字母个数
st[s[a][b]] = true; // 记录已走过的字母
ans = max(ans , d[a][b]); //把答案更新为已走过的最大的字母数
dfs(a , b); // 以当前点为依据 , 继续分别向四个方向拓展
st[s[a][b]] = false; // 恢复现场 , 回溯
d[a][b] = 0;
}
} // 如果四个方向都不能走,则返回
}
int main()
{
d[1][1] = 1; // 将起步字母记录为第一个字母
cin >> n >> m;
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= m ; j ++)
cin >> s[j][i]; // 读入字符矩阵
st[s[1][1]] = true; // 标记起步字母已走过
dfs(1 , 1); // 开始搜索
cout << ans << endl; // 输出答案
return 0;
}
正方形数组的数目
main里for枚举哪个数字是序列的开头
子函数里for看看 数 如果 不是所在区间的第一个可以被用的数 就不能用
只用所在区间的第一个数
讲解:
AcWing 4519. 正方形数组的数目(暑假每日一题2022) - AcWing
#include <algorithm>
#include <string>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 15;
int n, res;
int a[N];
bool st[N];
bool check(int num)
{
int p = (int)sqrt(num);
return p * p == num;
}
void dfs(int u, int last)
{
if (u >= n)
{
res ++;
return;
}
for (int i = 0; i < n; i ++)
{
if (i > 0 && !st[i - 1] && a[i] == a[i - 1]) continue;
//i-1>=0 上一个数还没用 所在区间
if (st[i]) continue;
if (check(last + a[i]))
{
st[i] = true;
dfs(u + 1, a[i]);
st[i] = false;
}
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
sort(a, a + n);
for (int i = 0; i < n; i ++)
{
if (i > 0 && a[i] == a[i - 1]) continue;
st[i] = true;
dfs(1, a[i]);
st[i] = false;
}
cout << res << endl;
return 0;
}