基本套路:
1.去找所有可能,一层一层深入
2.判断边界条件
3.回溯
例题:
1.排列数字
题目描述:
给定一个整数 nn,将数字 1∼n1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 nn。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤7
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
基本思路:全排列,去找所有可能,对每一种可能进行标记,当到尽头了就往回退一步,往下一个可能去找。
搜索树:当没有可选的数字时返回上一层,若仍无数字则继续往上,直到有可用数字。
#include <iostream>
using namespace std;
bool mark[8];
int arr[8];
int n;
void dfs(int m){
if(m==n){
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++){
if(!mark[i]){
arr[m]=i;//将当前的数字放入排列数组当前的位置中
mark[i]=true;//标记该数被使用过了
dfs(m+1);
mark[i]=false;
}
}
}
int main(){
cin>>n;
dfs(0);
return 0;
}
2.P1123 取数游戏
题目描述
一个N×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻8个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少。
输入格式
第1行有一个正整数TT,表示了有TT组数据。
对于每一组数据,第一行有两个正整数N和M,表示了数字矩阵为N行M列。
接下来N行,每行M个非负整数,描述了这个数字矩阵。
输出格式
T行,每行一个非负整数,输出所求得的答案。
输入样例
3
4 4
67 75 63 10
29 29 92 14
21 68 71 56
8 67 91 25
2 3
87 70 85
10 3 17
3 3
1 1 1
1 99 1
1 1 1
输出样例
271
172
99
3.洛谷P1451 求细胞数量
题目描述
一矩形阵列由数字 00 到 99 组成,数字 11 到 99 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
输入格式
第一行两个整数代表矩阵大小 nn 和 mm。
接下来 nn 行,每行一个长度为 mm 的只含字符 0
到 9
的字符串,代表这个 n \times mn×m 的矩阵。
输出格式
一行一个整数代表细胞个数。
输入
4 10
0234500067
1034560500
2045600671
0000000089
输出
4
4.n皇后(自定义棋盘大小)