DFS学不会系列

 

高手去散步

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=55;
int g[N][N];
int dist[N];
bool st[N];
int n,m,ma;
void dfs(int u,int sum)
{
    ma=max(ma,sum);
    for (int i=1; i<=n; i++)
    {
        if (!st[i]&&g[u][i])
        {
            st[i]=true;
            dfs(i,sum+g[u][i]);
            st[i]=0;
        }
    }
}
signed main()
{
    cin>>n>>m;
    for (int i=0; i<m; i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        g[a][b]=g[b][a]=max(g[a][b],c);
    }
    for (int i=1; i<=n; i++)
    {
        memset(st,0,sizeof st);
        st[i]=1;
        dfs(i,0);
    }
    cout<<ma<<"\n";
    return 0;
}

 1123取数问题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=30;
int g[N][N];
int st[N][N];
int n,m,ma;
int dx[8]= {-1,-1,0,1,1,1,0,-1},dy[8]= {0,1,1,1,0,-1,-1,-1};
void dfs(int x,int y,int sum)
{
    if (y==m+1)
    {
        y=1;
        x++;
    }
    if (x==n+1)
    {
        ma=max(ma,sum);
        return;
    }
    dfs(x,y+1,sum);
    if (!st[x][y])
    {
        st[x][y]++;
        for (int i=0; i<8; i++)
        {
            int a=x+dx[i],b=y+dy[i];
            st[a][b]++;
        }
        dfs(x,y+1,sum+g[x][y]);
        st[x][y]--;
        for (int i=0; i<8; i++)
        {
            int a=x+dx[i],b=y+dy[i];
            st[a][b]--;
        }
    }
}
signed main()
{
    int t;
    cin>>t;
    while (t--)
    {
        cin>>n>>m;
        ma=0;
        memset(st,0,sizeof st);
        for (int i=1; i<=n; i++)
            for (int j=1; j<=m; j++)
                cin>>g[i][j];
        dfs(1,1,0);
        cout<<ma<<"\n";
    }
    return 0;
}

 小埋与扫雷

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1010;
int g[N][N];//雷是1,空格是2,数字是3
bool st[N][N];
int n,m,ans;
int dx[8]= {-1,-1,0,1,1,1,0,-1},dy[8]= {0,1,1,1,0,-1,-1,-1};
void judge(int x,int y)
{
    bool have_lei=false;
    for (int i=0; i<8; i++)
    {
        int a=x+dx[i],b=y+dy[i];
        if (a>=1&&a<=n&&b>=1&&b<=m)
        {
            if (g[a][b]==1)
            {
                have_lei=true;
                break;
            }
        }
    }
    if (have_lei)g[x][y]=3;
    else g[x][y]=2;
    return;
}
void dfs(int x,int y)
{
    st[x][y]=true;
    for (int i=0; i<8; i++)
    {
        int a=x+dx[i],b=y+dy[i];
        if (a>=1&&a<=n&&b>=1&&b<=m)
        {
            if (g[a][b]==2&&!st[a][b])
                dfs(a,b);
        }
    }
    return;
}
bool check(int x,int y)
{
    bool no_kg=true;
    for (int i=0;i<8;i++)
    {
        int a=x+dx[i],b=y+dy[i];
        if (a>=1&&a<=n&&b>=1&&b<=m)
        {
            if (g[a][b]==2)
            {
                no_kg=false;
                break;
            }
        }
    }
    return no_kg;
}
signed main()
{
    cin>>n>>m;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
            cin>>g[i][j];
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
            if (!g[i][j])
                judge(i,j);
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
            if (g[i][j]==2&&!st[i][j])
                dfs(i,j),ans++;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            if (g[i][j]==3)
               if (check(i,j))
                  ans++;
    cout<<ans<<"\n";
    return 0;
}

 

posted @ 2022-07-15 20:05  好腻友Π  阅读(23)  评论(0)    收藏  举报