搜索:DFS

基本套路:

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皇后(自定义棋盘大小)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值