Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
这个 其实 ..K取值不到三位数 所以 完全可以从当前状态继续搜索如何从当前状态继续搜索呢 请看下面代码 第二次调用 就从原始状态开始就可以了 #pragma warning (disable :4996) #include<stdio.h> #include<algorithm> using namespace std; bool used[1026]; bool flag[1026]; int D[1026]; int data[1026]; int cnt,U; void DFS(int k,int m) { if(k==m) { cnt++; if(cnt<U)return; for(int i=1;i<m;i++) printf("%d ",data[i]); printf("\n"); return ; } else { if(flag[k]) { for(int i=1;i<m;i++) { if(cnt==U)return; if(cnt<U&&!used[i]) { used[i]=true; data[k]=i; DFS(k+1,m); used[i]=false; } } return; } flag[k]=true; for(int i=D[k];i<m;i++) { if(cnt==U)return; if(cnt<U&&!used[i]) { used[i]=true; data[k]=i; DFS(k+1,m); used[i]=false; } } } } void DFS2(int k,int m) { if(k==m) { cnt++; if(cnt<U)return; for(int i=1;i<m;i++) printf("%d ",data[i]); printf("\n"); return ; } else { for(int i=1;i<m;i++) { if(cnt<U&&!used[i]) { used[i]=true; data[k]=i; DFS(k+1,m); used[i]=false; } } } } int main () { int T; scanf("%d",&T); while(T--) { memset(used,false,sizeof(used)); memset(flag,false,sizeof(flag)); int N; scanf("%d%d",&N,&U); U; cnt=-1; for(int i=1;i<=N;i++) scanf("%d",D+i); DFS(1,N+1); while(cnt<U) { DFS2(1,N+1); } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator