1. 程式人生 > 實用技巧 >dfs:數芝麻-牛客+實際問題-牛客

dfs:數芝麻-牛客+實際問題-牛客

數芝麻dfs-牛客

暴力搜尋

程式碼;

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+10;
const int mod=142857;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef pair<int,int> pii;
int a[maxn][maxn];
int vis[maxn][maxn];
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int sum;

void dfs(int x,int y)
{
    sum
++; for(int i=0; i<4; i++) { int nx=x+dir[i][0]; int ny=y+dir[i][1]; if(!vis[nx][ny]&&a[nx][ny]==1) { vis[nx][ny]=1; dfs(nx,ny); } } } int main() { int n,m; while(cin>>n>>m) { if
(n==0&&m==0) break; int flag=0; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) cin>>a[i][j]; for(int i=1; i<=n; i++) { if(flag) break; for(int j=1; j<=n; j++) { if(!vis[i][j]&&a[i][j]==1
) { sum=0; vis[i][j]=1; dfs(i,j); if(sum==m) { flag=1; break; } } } } if(flag) cout<<"YES\n"; else cout<<"NO\n"; } system("pause"); return 0; }

實際問題 dfs-牛客

直接搜尋

程式碼:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
const int mod=142857;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef pair<int,int> pii;
int ans,flag;
int a[maxn];
int n,m,k;

ll qs(ll a,ll b)
{
    ll sum=0;
    while(b)
    {
        if(b&1) sum*=a;
        a*=a;
        b>>=1;
    }
    return sum;
}

void dfs(int num,int cnt)
{
    if(flag) return ;
    if(cnt==m+1)
    {
      ans++;
      if(ans==k)
      {
        for(int i=1; i<=m; i++)
         cout<<a[i]<<" ";
        cout<<endl;
        flag=1;
        return ;
      }
      return ;
    }
    for(int i=num; i<=n-m+cnt; i++)
    {
        a[cnt]=i;
        dfs(i+1,cnt+1);
        if(flag) return ;
    }
}
 int main()
 {
    int t;
    cin>>t;
    while(t--)
    {
        ans=0;
        flag=0;
        cin>>n>>m>>k;
        dfs(1,1);
    }
     system("pause");
     return 0;
 }