标签:printf algo 时间 return 专用 col 顺序 size 第一个
★★☆ 输入文件:dlj.in
输出文件:dlj.out
简单对比
时间限制:1 s 内存限制:128 MB
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,ans,sum,map[110][110],v[110][110],f[110][110]; int use[110]; bool judge(int x){ for(int i=1;i<=x;i++) //要保证字典序,不出现重复。 if(map[x][i]&&use[i]) return false; return true; } void dfs(int t,int now){ //搜索到第t个点,当前留下的点的个数为now个。 if(ans-now>n-t+1) return ; if(t>n){ if(now>ans) sum=0; memcpy(v[++sum],use,sizeof(use)); //记录选点的情况。 ans=now; return ; } if(judge(t)&&!use[t]){ //判断一个点是否能被留下。 use[t]=1; //如果与这个点相连的点中没有被选中的并且这个点没有入选。 dfs(t+1,now+1); use[t]=0; } dfs(t+1,now); //不能被留下,继续找下一个点。 } int main(){ //freopen("dlj.in","r",stdin); //freopen("dlj.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++){ int falg=0; for(int j=1;j<=n;j++){ scanf("%d",&map[i][j]); if(map[i][j]) falg=1; } if(falg==0){ use[i]=1; //use记录点是否被选中留下。 ans++; //ans记录留下的点的个数。 } } dfs(1,ans); //从第一个点开始搜索,当前留下的点的个数为ans个。 cout<<ans<<endl<<sum<<endl; for(int i=1;i<=sum;i++){ for(int j=1;j<=n;j++) if(v[i][j]) printf("%d ",j); cout<<endl; } }
标签:printf algo 时间 return 专用 col 顺序 size 第一个
原文地址:http://www.cnblogs.com/cangT-Tlan/p/7467843.html