dfs练习(一)

随机迷宫生成算法——深度优先算法 迷宫是我们小时候经常玩的游戏,如何用代码来快速生成上面这种迷宫呢? 迷宫算法有三大算法:深度优先算法、prim算法和递归分割算法。这里用的是深度优先算法,在此说一下算法思路,希望对各位有所帮助。 首先我的假设是,迷宫只有一条正确的道路。 这个时候请把自己想象成一只地鼠,要在这个区域不停的挖,直到任何一块区域再挖就会挖穿了为止。 我们挖的道路就像树结构,树上有很多的分支,分支也有子... 阅读详情

题目:Badge

思路:简单的dfs,因为只用一个分支,当再次回来的时候就是结果。
代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;

int a[maxn], tot = 0;
int n, vis[maxn], ans = 0;
int dfs(int u)
{
    vis[u] = 1;
    int t = a[u];
    if(!vis[t])
        dfs(t);
    else return t;//如果回到之前标记的就是结果
}
int main()
{
    int v;
    scanf("%d", &n);
    tot = 0;
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
    }
    for(int i = 1; i <= n; i++)
    {
        memset(vis, 0, sizeof(vis));
        ans = 0;
        if(i != 1)printf(" ");
        printf("%d", dfs(i));
    }
    printf("\n");
    return 0;
}

题目:Protect Sheep

题意:就是给你一个图,图上有羊和狼,不让狼吃羊,你必须在用狗去把狼隔开,注意不用考虑放置狗的个数最少You don’t have to minimize the number of dogs。
思路:既然不用考虑够的个数最少,那么只需要,判断羊的四周是否是狼,如果是狼那么就输出NO,否则输出YES以及放置后的地图。
代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 505;
char mp[maxn][maxn];
int vis[maxn][maxn];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0}, n, m;
int flag = 1;

int main(){
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; i++){
        scanf("%s", mp[i]);
    }
    flag = 1;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(mp[i][j] == 'S'){
                if(mp[i][j-1] == 'W'|| mp[i-1][j] == 'W' ||mp[i+1][j] == 'W'|| mp[i][j+1] == 'W'){
                    printf("NO\n");
                    return 0;
                }
            }
        }
    }
    printf("YES\n");
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(mp[i][j] == '.')printf("D");
            else printf("%c", mp[i][j]);
        }
        printf("\n");
    }

return 0;
}


题目:King Escape

题意:本题的大体思路就是给你三个点(ax, ay),(bx, by),(cx, cy),问你从(bx,by)这个点能否不经过与(ax, ay)同行同列同一对角线到达(cx, cy),如果能输出YES,否则输出NO。
思路:本题的主体思路就是类似与dfs走迷宫的那类题,但是本题需要加入一些判断,使走过的路线不与(ax, ay)同行同列同一对角线,不同行不同类好比较。但是不同对角线如何比较,通过观察图发现,同一对角线斜路是-1或者1.然后在通过y = x+b或者y = -x+b,把(ax, ay)这个点带入,就能求出b,然后根据方程判断是否与(ax, ay)在同一对角线上。
本题还可以以(ax,by)作为原点建立直角坐标系,如果(bx,by)和(cx,cy)在同一象限那么就输出YES,,否则输出NO。为什么可以这么做你可以看图找一下规律。
参考博客:CF1033A. King Escape的题解
代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1010;
int ax, ay, bx, by, cx, cy, n, b1, b2;
bool Judge1(int x, int y){
     if(y == x+b1)return true;
     else return false;
}
bool Judge2(int x, int y){
     if(y == -x+b2)return true;
     else return false;
}
int dx[10] = {0,0,1,1,1,-1,-1,-1};//八个方向
int dy[10] = {1,-1,1,-1,0,1,-1,0};
int vis[maxn][maxn];//标记
int flag =  0;
bool dfs(int x, int y){
    vis[x][y] = 1;
    if(x == cx && y == cy){//到达终点
        flag = 1;
        return true;
    }
    for(int i = 0; i < 8; i++){
        int tx, ty;
        tx = x+dx[i];
        ty = y+dy[i];
        if(tx >= 1 && tx <= n && ty >= 1 && ty <= n && !vis[tx][ty] && !Judge1(x, y) && !Judge2(x, y) && tx != bx && ty != by){//判断
            vis[tx][ty] = 1;
            if(dfs(tx, ty))return true;//递归
        }
    }
    return false;
}
int main(){

    memset(vis, 0, sizeof vis);
    scanf("%d", &n);
    scanf("%d %d", &bx, &by);
    scanf("%d %d", &ax, &ay);
    scanf("%d %d", &cx, &cy);
    b1 = by-bx;
    b2 = bx+by;
    int t = dfs(ax, ay);
    if(t)cout<<"YES"<<endl;
    else cout<<"NO"<<endl;


return 0;
}

题目:New Year Transportation

题意:本题的题意就是给你i点可以到大(i+ai),问你是否能到大K,如果能到达输出YES,否则话输出NO。因为本题已经约束了1<ai<n-i,所以不用考虑i+ai越界。
思路:本题就是一道水题,简单的dfs就能解决。
代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e4+10;
int a[maxn], n, k;
bool dfs(int x){

     if(x > k)return false;//因为不能回退,所以当x>k时就已经没有搜到
     if(x == k)return true;
     dfs(x+a[x]);
     //return false;
}
int main(){
    scanf("%d %d", &n, &k);
    for(int i = 1; i < n; i++)scanf("%d", &a[i]);
    int t = dfs(1);
    if(t)cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
return 0;
}


题目:Transformation: from A to B

题意:给你两个数a, b,让你通过一两种操作把a变成b,这两中操作分别是x–>2x, x–>x10+1;通过这两种操作如果不能变成b输出NO,如果能就输出YES 操作数 变换的过程
思路:一个思路就是简单的dfs,另外一个就是根据性质去推从b往前推a,如果b是偶数那么b就除以2,如果b为奇数那么就是通过10*x+1这个步骤。
参考博客:CodeForces–TechnoCup–2016.10.15–ProblemA–Transformation: from A to B
dfs代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
#define LL long long
const int INF = 100000;
int vis[maxn], val[maxn],ans = INF;//val存储路径
LL a, b;
void dfs(LL x, LL step){
     if(x == b){//如果到达终点
        if(step < ans){//步数小于当前的步数
            for(int i = 0; i < step; i++){//更新
                val[i] = vis[i];
            }
            ans = step;
        }
        return;
     }
     if(x*2 <= b){//乘2的操作
        vis[step] = x*2;
        dfs(x*2, step+1);
        vis[step] = 0;
     }
     if(x * 10 + 1 <= b){//后面补1的操作
        vis[step] = x*10+1;
        dfs(x*10+1, step+1);
        vis[step] = 0;
     }
}
int main(){
    scanf("%lld %lld", &a, &b);
    dfs(a, 0);
    if(ans == INF)printf("NO\n");
    else {
        printf("YES\n");
        printf("%d\n", ans+1);
        printf("%d", a);
        for(int i = 0; i < ans; i++){
            printf(" %d", val[i]);
        }
        printf("\n");
    }
return 0;
}

题目:The Way to Home

题意:本题的题意就是给你一个长度为n的字符串,让你从1开始走,走到n,每次走的距离不能超过d,而且每次走的时候只能走数值为1的点,如果可以到达n,输出结果最小步数,否则输出-1。
思路:本题有两种思路一个是dfs,一个数模拟,先说dfs吧,首先我设当前结点为x,然后从k最小开始dfs,然后在到达n点的时候去更新最小值,后来发现跑到第15组就超时了,我感觉这种方法存在问题,从k最大开始搜索这么就不用去更新最小值了,因为这么做一定是最优的,结果跑到44组就超时了,虽然有一定的优化但是还是存在一定问题,我就想可不可以用数组去标记,仔细思考了一下,发现是可以的,为什么是可以的如果我把当前结点标记了如果搜索失败在回溯的时候,如果已经标记了那么证明从该点的路径是不可达的,所以不能走。
模拟的思想其实也差不多,每一次尽量走最大的如果不能走就往前挪一下,重复上述操作。参考博客:The Way to Home (模拟)
dfs代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000;
char str[maxn];
int n, k, ans = maxn;
bool vis[maxn];
bool dfs(int x, int step){
     if(x == n){//到达n点
        ans = step;
        return true;
     }
     for(int i = k; i > 0; i--){
        if(str[x+i] == '1' && !vis[x+i]){
            vis[x+i] = 1;
            if(dfs(x+i, step+1))return true;

        }
     }
     return false;
}
int main(){
    scanf("%d %d", &n, &k);
    scanf("%s", str+1);
    ans = maxn;
    dfs(1,0);
    if(ans == maxn)printf("-1\n");
    else printf("%d\n", ans);

return 0;
}

题目:DZY Loves Chessboard

题目:本题题意就是给你一个矩阵,"."代表可以放置棋子的,“-”代表不可以放置棋子,然后让你把所有相邻的可以放置棋子的位置放置不同的颜色的棋子,如果只能放置一个棋子的这种情况所以放置。
思路:就是一个迷宫类型的搜索的简单变形,只需要增加一个变量就可以,用它来记录之前的情况。
代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 105;
char a[maxn][maxn];
bool vis[maxn][maxn];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1,0, 0};
int n, m;
void dfs(int x, int y, int flag)
{
    if(!flag)a[x][y] = 'B';
    else a[x][y] = 'W';
    for(int i = 0; i < 4; i++)
    {
        int tx, ty;
        tx = x + dx[i];
        ty = y + dy[i];
        if(tx >= 0 && tx < n && ty >=0 && ty < m && a[tx][ty] == '.')
        {
            dfs(tx,ty,!flag);
        }
    }
}
int main()
{
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; i++)
    {
        scanf("%s", a[i]);
    }
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            if(a[i][j] == '.')dfs(i, j, 0);
        }
    }
    for(int i = 0; i < n; i++)printf("%s\n", a[i]);
    return 0;
}

题目:Students and Shoelaces

题意:本题的题意就是你通过取消只与一个点相连所有点,然后在重复操作,统计你的操作个数。
思路:本题就是一个拓扑排序,因为是无向图,所以所有点都是入度,然后找到入度为1的点。
代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 105;
int a[maxn][maxn];
bool vis[maxn][maxn];
int n, m;
int degree[maxn];

queue<int>q;
int cn = 1, ans = 0, tmp;
void TopSort(int n)
{
    int cnt = 0;
    for(int i = 1; i <= n; i++)
    {
        if(degree[i] == 1)
        {
            q.push(i);
            cnt++;
        }

    }
    if(cnt)ans++;//如果存在入度为1的点,操作次数加一
    while(!q.empty())
    {
        tmp = q.front();
        q.pop();
        for(int i = 1; i <= n; i++)
        {
            if(a[tmp][i])
            {
                degree[i]--;
                degree[tmp]--;

            }
        }
        cnt--;
        if(cnt == 0)//如果第一次的都已经完事了
        {

            for(int i = 1; i <= n; i++)//开始下一步
            {
                if(degree[i] == 1)
                {
                    q.push(i);
                    cnt++;
                }

            }
            if(cnt)ans++;//如果下一步存在,结果加一
        }
    }
}
int main()
{

    int u, v;
    ans = 0;
    scanf("%d %d", &n, &m);
    for(int i = 0; i < m; i++)
    {
        scanf("%d %d", &u, &v);
        a[u][v] = a[v][u] = 1;
        degree[u]++;
        degree[v]++;
    }
    TopSort(n);
    cout<<ans<<endl;
    return 0;
}

题目:Party

题意:本题的题意就是把不同的不存在上级的人放在同一组中。
思路:本题的思想非常简单,就是几个建图加上拓扑排序就完事了,如果存在没有上级的那种就不用处理了。
代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2005;
int degree[maxn];
int mp[maxn][maxn];
struct Node{
       int id, x;
}tmp;
int ans = 0, n;
queue<Node>q;
void TopSort(){//拓扑排序
     for(int i = 1; i <= n; i++){
        if(!degree[i]){
           tmp.id = 1;
           tmp.x = i;
           q.push(tmp);
        }

     }
     while(!q.empty()){
        tmp = q.front();
        int x = tmp.x;
        int id = tmp.id;
        q.pop();
        ans = max(ans, id);
        for(int i = 1; i <= n; i++){
            if(mp[x][i]){
                degree[i]--;
                if(!degree[i]){
                    tmp.x = i;
                    tmp.id = id+1;
                    q.push(tmp);
                }
            }
        }
     }
}
int main(){
    int  t;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d",&t);
        if(t == -1)continue;//不存在上级的这种情况
        mp[t][i] = 1;//反向建图
        degree[i]++;
    }
    TopSort();
    printf("%d\n", ans);

return 0;
}

题目:RumorRumor

题意:就是告诉你贿赂每一个人要多少钱,朋友之间可以免费互传消息,所以问你最小的花费。
思路:本题可以利用并查集写,也可以用dfs写。我只列出dfs代码。
并查集代码:参考博客:codeforces 893 C.Rumor
dfs代码:

#include<bits/stdc++.h>
using namespace std;
const long long INF = 1e9+1;
const int maxn = 1e5+10;
int vis[maxn], val[maxn];
int ne[maxn*2], e[maxn*2],h[maxn*2], tot = 0;
void add(int u, int v)//链式前向星存储,注意无向图,所以需要开2*maxn
{
    e[tot] = v;
    ne[tot] = h[u];
    h[u] = tot++;
}
int ans;
void dfs(int u)//搜索
{
    vis[u] = 1;
    ans = min(ans, val[u]);
    for(int i = h[u]; i != -1; i = ne[i])
    {
        int t = e[i];
        if(!vis[t])
        {

            dfs(t);
        }
    }
}
int main()
{
    int n, m, u, v;
    scanf("%d %d", &n, &m);
    memset(h, -1, sizeof(h));
    for(int i = 1; i <= n; i++)scanf("%d", &val[i]);
    for(int i = 1; i <= m; i++)
    {
        scanf("%d %d", &u, &v);
        add(u, v);
        add(v,u);
    }
    long long sum = 0;

    for(int i = 1; i <= n; i++)
    {
        ans = INF;
        if(!vis[i])//如果没有搜索过
        {
            dfs(i);
            sum += ans;
        }
    }
    printf("%lld\n", sum);
    return 0;
}

题目:Plus from Picture

题意:本题的题意就是给你一个图,当这张图上当且仅当只有一个由* 围成的+号,并且除了这个加好的四个方向上有*, 其他地方不能有 *这种情况下输出YES,否则输出NO。
思路:本题就是一个暴力,首先找到中心点如果找到仅找到一个中心点,那么就以这个点为中心向四周扩展,标记扩展经过的点,然后暴力一遍,有没有没有经过的点,那么就是NO,没有的话就是YES,找到多个或者没有找到中心点也是NO。
代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 505;
char mp[maxn][maxn];
int vis[maxn][maxn];
int n, m;
int main()
{
    scanf("%d %d", &n, &m);
    for(int i =  0; i < n; i++)
    {
        scanf("%s", &mp[i]);
    }
    int st, en, flag = 0;
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            if(mp[i][j] == '*' && i > 0 && i < n-1 && j > 0 && j < m-1)//找中心点
            {
                if(mp[i][j-1] == '*' && mp[i-1][j] == '*' && mp[i][j+1] == '*' && mp[i+1][j] == '*')
                {
                    flag++;
                    st = i;
                    en = j;
                }
            }
        }
    }
    if(flag == 1)
    {
        vis[st][en] = 1;//别忘了把中心点标记一下
        for(int i = st+1; mp[i][en] == '*'; i++)vis[i][en] = 1;
        for(int i = st-1; mp[i][en] == '*'; i--)vis[i][en] = 1;
        for(int i = en+1; mp[st][i] == '*'; i++)vis[st][i] = 1;
        for(int i = en-1; mp[st][i] == '*'; i--)vis[st][i] = 1;
        int k = 0;
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m; j++)
            {
                if(mp[i][j] == '*' && !vis[i][j]){
                    k = 1;
                    break;
                }
            }
        }
        if(k)cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
    else cout<<"NO"<<endl;
    return 0;
}

题目:Coloring a Tree

题意:本题的题意就是给你一颗树,每一个节点都应该染成他所需要的颜色,但是在染色的同时会同时把他的子树给染色了,问你需要多少步,把这个树变成你需要的树的颜色。
思路:本题的思路就是从根节点开始染色,把所有的子节点染成需要的颜色。
代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e4+10;
int vis[maxn], color[maxn];
int head[maxn], nx[maxn], e[maxn], tot = 0;
void add(int u, int v){
    e[tot] = v;
    nx[tot] = head[u];
    head[u] = tot++;
}
void dfs(int x, int cr){
     vis[x] = cr;
     for(int i = head[x]; i != -1; i = nx[i]){
        int t = e[i];
        dfs(t, cr);

     }
}
int main(){
    int n, v;
    memset(vis, 0, sizeof vis);
    memset(head, -1, sizeof head);
    scanf("%d", &n);
    for(int i = 2; i <= n; i++){
        scanf("%d", &v);
        add(v, i);
    }
    int step = 0;
    for(int i = 1; i <= n; i++)scanf("%d", &color[i]);
    for(int i = 1; i <= n; i++){//这个需要根据结果去推一下
        if(vis[i] == color[i])continue;
        else {
            step++;
            dfs(i, color[i]);
        }
    }
    cout<<step<<endl;
return 0;
}

或者:

#include<bits/stdc++.h>
using namespace std;
queue<int>q;
const int maxn = 1e4+10;
int vis[maxn], color[maxn];
int head[maxn], nx[maxn], e[maxn], tot = 0;
void add(int u, int v)
{
    e[tot] = v;
    nx[tot] = head[u];
    head[u] = tot++;
}
void dfs(int x, int cr)
{
    vis[x] = cr;
    for(int i = head[x]; i != -1; i = nx[i])
    {
        int t = e[i];
        dfs(t, cr);
    }
}
int main()
{
    int n, v;
    memset(vis, 0, sizeof vis);
    memset(head, -1, sizeof head);
    scanf("%d", &n);
    for(int i = 2; i <= n; i++)
    {
        scanf("%d", &v);
        add(v, i);
    }
    int step = 0;
    for(int i = 1; i <= n; i++)scanf("%d", &color[i]);
    q.push(1);
    while(!q.empty())
    {
        int t = q.front();
        for(int i = head[t]; i != -1; i = nx[i])
        {
            q.push(e[i]);
        }
        q.pop();
        if(vis[t] == color[t])continue;
        else
        {
            step++;
            dfs(t, color[t]);
        }
    }
    cout<<step<<endl;
    return 0;
}

题目:Two Buttons

由于是最短的所以bfs更好。
代码:

#include<bits/stdc++.h>
using namespace std;
 
int n, m, ans = 0;
int vis[10010];
queue<int>q;
int dfs(int x)
{
    q.push(x);
    vis[x] = 0;
    while(q.size()){
        int t = q.front();
        q.pop();
        if(t == m)return vis[m];
        int xx = t * 2;
        if(xx <= 10000 && !vis[xx]){
            vis[xx] = vis[t] + 1;
            q.push(xx);
        }
        xx = t-1;
        if(xx > 0 && !vis[xx]){
            vis[xx] = vis[t] + 1;
            q.push(xx);
        }
 
    }
 
}
int main()
{
    scanf("%d %d", &n, &m);
    ans = 1e7;
    ans = 0;
    if(n > m)
    {
        cout<<n-m<<endl;
    }
    else
    {
        cout<<dfs(n)<<endl;
    }
 
    return 0;
}

题目: Ice Skating

思路:就是求出几个互相联通的集合,集合的数量减去1就是答案。
代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int x[maxn], y[maxn];
int n, vis[maxn];
void dfs(int i){
     vis[i] = 1;
     for(int j = 1; j <= n; j++){
        if(!vis[j] && (x[i] == x[j] || y[i] == y[j])){
            dfs(j);
        }
     }
}
int main(){
    scanf("%d",&n);
    for(int i = 1; i <= n; i++){
        scanf("%d %d", &x[i], &y[i]);
    }
    int ans = 0;
    for(int i = 1; i <= n; i++){
        if(!vis[i])
        dfs(i), ans++;
    }
    printf("%d\n", ans-1);

return 0;
}

递归回溯深度优先搜索DFS练习题(含C++源码) # 递归回溯深度优先搜索DFS算法练习题 C++ 含源码 包含题目:《过河卒》《出栈序列统计》《算24点》《冗余依赖》《走迷宫》《单项双轨道》《组合的输出》《售货员的难题》《驾车旅游》《关路灯》 立即下载

相关推荐

C语言——利用矩阵LU分解法求逆、行列式

本章介绍了LU分解法,以及如何利用LU分解法求逆、行列式,针对每个公式、原理、代码进行了详细介绍,希望可以给大家带来帮助。

王元笙 1万+

计蒜客-中国象棋(DFS)

中国象棋博大精深,其中马的规则最为复杂,也是最难操控的一颗棋子。 我们都知道象棋中马走"日",比如在 (2,4)(2, 4)(2,4) 位置的一个马,跳一步能到达的位置有 (0,3)(0, 3)(0,3),(0,5)(0, 5)(0,5),(1,2)(1, 2)(1,2),(1,6)(1, 6)(1,6),(3,2)(3, 2)(3,2),(3,6)(3, 6)(3,6),(4,3)(4, 3)(4,3),(4,5)(4, 5)(4,5)。 蒜头君正在和花椰妹下棋,蒜头君正在进行战略布局,他需要把在 (x

qq_43531919的博客 1820

STM32控制舵机SG-5010转动,HAL库

首先设置时钟为72Mhz,预分频系数为72-1,自动重装载计数器的值为5000-1,这样的话就可以得到一个5ms的脉冲宽度,5000的计数值可以让舵机的旋转角度变得更加易控且相对精准,计算旋转角度的时候也可以更加精确。所以我们5ms脉宽,period是5000脉宽-------------角度----------pulse0.5ms-------------0度----------500;1.0ms------------45度---------1000;

qq_73783264的博客 1291

回溯算法题(DFS)

深度优先遍历主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底...,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点是不撞南墙不回头,先走完一条路,再换一条路继续走。树是图的一种特例(连通无环的图就是树),接下来我们来看看树用深度优先遍历该怎么遍历。1、我们从根节点 1 开始遍历,它相邻的节点有 2,3,4,先遍历节点 2,再遍历 2 的子节点 5,然后再遍历 5 的子节点 9。

2301_80224556的博客 1971

HFSS螺旋线圈的优化设计与高效仿真实践

本文详细介绍了HFSS螺旋线圈的优化设计与高效仿真实践,涵盖核心参数设置、参数化建模、仿真加速技巧及结果分析。通过HFSS软件实现螺旋线圈的高效仿真,特别适用于无线充电和RFID系统设计,提升设计效率与性能验证准确性。

weixin_30235225的博客 443

fbx bip互转 测试OK

fbx bip互转

jacke121的专栏 516

DFS专题练习

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

Xpy_021101的博客 239

【00】虹软2023届校招专场 ,计算机类笔试攻略(笔试考试时间、考察范围、笔试难度 等说明)

虹软科技2023校招笔试攻略:三大岗位类别(算法、算法优化、开发)分别于7月24日进行。题型包括选择题、编程题和问答题,其中算法类题目降低难度,编程题改为LeetCode模式。重点考察数学基础、机器学习、编程能力(C/C++/Python)、数据结构和算法优化等。建议根据投递岗位选择问答题,算法优化类注重系统知识和SIMD优化,开发类侧重多线程等实际应用能力。笔试结果将作为校招offer的重要参考。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 276

DFS例题

深度优先遍历和广度优先遍历:可参考 深度优先遍历和广度优先遍历 数独游戏: 你一定听说过“数独”游戏。 如下图所示,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。 数独的答案都是唯一的,所以,多个解也称为无解。 本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕...

曹世宏的博客 2948

Unity 佳能SDK 及数据获取

3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中。1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你。2. 将SDK这两个文件放到 Unity Plugins文件夹。

我知道你很急,但是路要一步步走 1474

实验十一 ——————二层交换基础

实验内容实验网络拓扑图如上所示SW1以及SW2都创建VLAN10和VLAN20,按照上图所示,将接口添加到特定的VLAN;测试PC之间的连通性,要求相同VLAN内的PC能够相互通信要求设置两台交换机名称以及进行特权模式的密码,并允许通过Telnet方式管理交换机实验目的了解二层交换机工作原理掌握交换机基本配置命令理解VLAN的概念,掌握VLAN的配置理解trunk的概念,掌握trunk的配置实验步...

Fly_鹏程万里 1489

12 30数据结构与dfs,bfs练习

12 30

m0_73955064的博客 172

ADB 安装教程:如何在 Windows、 Linux 上安装 Android Debug Bridge

本文介绍了在Windows和Linux系统上安装ADB(Android调试桥)的方法。对于Windows系统:1)从官网下载ADB工具并解压;2)通过命令提示符验证安装;3)配置环境变量以实现全局使用;4)再次验证全局ADB功能。Linux系统可通过包管理器直接安装(如Ubuntu使用apt,Fedora使用dnf),安装后同样需验证版本信息确认成功。两种系统安装完成后,都能通过"adb version"命令检查安装状态。

qq_53545309的博客 440

暑期练习(一) DFS

刷题(一) DFS 1.HDU-1518 https://vjudge.net/problem/HDU-1518 Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square? Input The first line of input contains N, the number of test cases. Each test case begins w

May the Force be with you 545

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

深度优先搜索练习一

例题一:放牌 假如有编号为1~ 3的3张扑克牌和编号为1~3的3个盒子,现在需要将3张牌分别放到3个盒子中去,且每个盒子只能放一张牌,一共有多少种不同的放法。 当走到一个盒子面前的时候,到底要放那一张牌呢?在这里应该把所有的牌都尝试一遍。假设这里约定一个顺序,按牌面值从小到大依次尝试。在这样的假定下,当走到第一个盒子的时候,放入1号牌。 放好之后,继续向后走,走到第二个盒子面前,此时还剩2张牌,牌面值最小的为2号牌,按照约定的规则,把2号牌放入第二个盒子。 此时,来到第三个盒子面前,只剩一张牌,放入第三个

阿辉爱睡觉的博客 606

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

dfs入门练习一

链接:acm.fafu.edu.cn/problem.php?id=1593    Description: 现给定一个含有n个元素的数组A,要求:从这n个数中选择一些数,这些数的和恰好为k Input: 多组测试数据。第一行为n(1<=n<=20) 第二行为n个整数,每个数的范围为(-10^8≤A[i]≤10^8) 第三行为整数k(-10^8≤k≤10^8)

Uitachi1的博客 821

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

DFS练习一---HDU 1342

参考文章来源:http://blog.youkuaiyun.com/pengwill97/article/details/54850852 题目在这里:HDU.1342 最近在练习DFS,就找了一些题来做,力求自我总结,有所收获,这个是第一道题目。 首先,深度优先搜索(DFS,Depth-First Search )是搜索手段中的一种,总某个状态开始,不断转移状态直到状态无法转移,然后就退回到上一...

weixin_34342992的博客 188

C++深度优先搜索一(练习题)

【描述】已知山洞里面是由许多房间组成的迷宫,每个房间可以通往上下左右四个房间,迷宫大小是一个NN的正方形,其中有一些怪兽堵路。现在从起始(1,1)的位置进入洞穴寻找宝藏(已有一个宝箱),如果可以找到宝藏输出YES,否则输出NO。【输入格式】第一行是一个正整数N (2<N≤10),后面包含NN行,由0、1、2组成的矩阵,其中0表示可以走,1表示怪兽,2表示宝藏的位置。(注意:第一个房间没有怪兽)【输出格式】找到宝藏输出YES,否则输出NO。【输入样例】40 0 0 1。

weixin_46669997的博客 159

复习DFS 挑战程序设计竞赛一书的练习题

今天做了下AOJ 0118的试题 比较基础题目大意是给你一个矩形区域,每个小块可以种三种树,求联通量的个数。题目原样是日语 看不懂 网上搜的翻译#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;algorithm&gt;#include&lt;cmath&gt;#include&lt;cstring&gt;#define Max 5...

qq_26939031的博客 192

【算法笔记】深度优先算法DFS(保姆级教学,一篇让你搞懂DFS的精髓)

本文章介绍了搜索算法中常用的DFS深度优先算法,它的核心思想是从一个起点开始,沿着一个方向尽可能深地搜索,直到无法继续为止,然后回溯到上一个节点,继续沿着其他方向搜索。DFS可以使用递归或栈(非递归)来实现。

weixin_74297512的博客 6516

深度优先算法(DFS)

根据访问节点的顺序与方式,可以分为广度优先算法(BFS)和深度优先算法(DFS),本文介绍深度优先算法: 深度优先算法 1、算法概述 深度优先搜索属于图算法的一种,英文缩写为DFS。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。 深度优先搜索是一种在开发爬虫早期使用较多的方法,它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。 它的...

qq_41896683的博客 3万+

深度优先算法DFS(Depth First Search)

不撞南墙不回头。

Iamme 1万+

LeetCode琅琊榜第十三层-全排列(DFS深度优先算法)

LeetCode.46全排列 难度:中等 博主空间与往期力扣 题目链接

算法萌新一枚 804

深度优先算法 DFS总结(算法详解+模板+例题)

沿着树的深度遍历树的节点,尽可能深的搜索树的分支。共 m+1 行,第 1 行为 2 个数,n 和 m,分别表示一共有 n(n≤105) 篇文章(编号为 1 到 n)以及m(m≤106) 条参考文献引用关系。一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。有一个 n \times mn×m 的棋盘,在某个点 (x, y)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

Alex_Fufu的博客 1万+

DFS (深度优先算法)

DFS(深度优先搜索算法):一种用于遍历或者树或者图的算法,是一种递归程序,不断递归达到无法在到达的点,简单点来说:一条路一直走,走到没有路后就原路返回,重新选择另一条 dfs(step + 1)。 DFS = 暴搜 + 回溯算法 + 剪枝(大多数是这样)。DFS需要回溯算法,其他算法也需要回溯算法,两种是一种调用关系。 暴搜:一条路走到黑(直接递归走到底) 回溯:DFS开启另一条路则需要回溯,如果暴搜那条路找不到答案就要回溯走另外一条道路。 剪枝:如果明确接下来的搜索找不到答案或者不是最优解,就

qq_46056407的博客 4730
上一篇: Nothing for nothing ( 八 )
下一篇: Nothing for nothing( 九 )
Re:fused
博客等级 码龄9年 474粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值