暴力搜索
#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 "; else cout<<"NO "; } system("pause"); return 0; }
直接搜索
#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; }