1、dfs(该模板模拟的是数字的全排列,本质是迭代)
`
const int N = 10;
int res[N];int state[N];//res存放排列,state存放该数字是否用过
int n;
void dfs(int u) {
if (u > n) {
for (int i = 1; i <= n; i++) {
cout << res[i] << " ";//如果已经排了n个数字,则结束
}cout << endl;
}
//遍历所有i,即待排列的数字,如果用过,则跳过
for (int i = 1; i <= n; i++) {if (state[i] != 1) {res[u] = i;//u的作用是作为res中的索引下标state[i] = 1;dfs(u + 1);state[i] = 0;//dfs的核心,回溯}
}
}
int main() {
cin >> n;dfs(1);
return 0;
}`
2、bfs(扩散搜索,大多数时候要剪枝)
`
const int NUM = 110;
int p[NUM][NUM];int len[NUM][NUM];//p用于存储该点是否到达过,len存储从起点走到该点所花费的步数
int n, m;
typedef pair<int, int>Pi;
void bfs(int a, int b) {
queue
q.push({a,b});
while (!q.empty()) {
Pi str = q.front();
q.pop();//这个容易忘
int dx[4] = { 0,0,-1,1 };
int dy[4] = { -1,1,0,0 };
for (int i = 0; i < 4; i++) {
int tx = str.first + dx[i];
int ty = str.second + dy[i];
if (p[tx][ty] == 0) {
p[tx][ty] = 1;//更新走过
len[tx][ty] = len[str.first][str.second] + 1;//步数从上一步加一
q.push({ tx,ty });
}
}
}
cout << len[n][m];
}
int main() {
memset(p, 1, sizeof(p));
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> p[i][j];
len[i][j] = 0;
}
}
bfs(1, 1);
return 0;
}`