poj1176 party lamps(dfs)

    xiaoxiao2026-08-17  12

    千辛万苦的用char型过了……

    下面那个我觉得也对……然而不过

    代码在这:

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; int n,c; int a[101]; int op[101]; int cl[101]; char ss[300][110]; int cmp(const void *p,const void *q) { return strcmp((char *)p,(char *)q); } void do1() { for(int i=1;i<=100;++i) a[i]^=1; } void do2() { for(int i=2;i<=n;i+=2) a[i]^=1; } void do3() { for(int i=1;i<=n;i+=2) a[i]^=1; } void do4() { for(int i=1;i<=n;i+=3) a[i]^=1; } int cnt=0; int check() { for(int i=1;i<=n;++i){ if(op[i]==1&&a[i]==0) return 1; if(cl[i]==1&&a[i]==1) return 1; } return 0; } void dfs(int x) { if(x==c) { if(check()==0) { for(int i=0; i<n; i++) ss[cnt][i]=a[i+1]+'0'; ss[cnt][n]='\0'; cnt++; } return; } for(int i=1;i<=4;++i) { switch(i) { case 1: do1(); dfs(x+1); do1(); break; case 2: do2(); dfs(x+1); do2(); break; case 3: do3(); dfs(x+1); do3(); break; case 4: do4(); dfs(x+1); do4(); break; } } } int main() { scanf("%d%d",&n,&c); memset(op,0,sizeof(op)); memset(cl,0,sizeof(cl)); for(int i=1;i<=n;++i) a[i]=1; int x; while(scanf("%d",&x)==1&&x!=-1) op[x]=1; while(scanf("%d",&x)==1&&x!=-1) cl[x]=1; if(c>4) { c%=2; if (c==1) { c=3; } else { c=4; } } dfs(0); qsort(ss,cnt,sizeof(ss[0]),cmp); printf("%s",ss[0]); printf("\n"); int i,j,flag; for(i=0,j=1;j<cnt;j++) { flag=0; for(int k=0;k<=6;++k) { if(ss[i][k]!=ss[j][k]) {flag=1;break;} } if(flag){ i=j; printf("%s",ss[j]); printf("\n"); } } return 0; } /*int li[9][7]={ 0,0,0,0,0,0,0, 0,0,0,0,0,0,0,//按1 0,0,0,1,1,1,0,//按1按4 0,0,1,0,1,0,1,//按3 0,0,1,1,0,1,1,//g按1按4 0,1,0,0,1,0,0,//按4 0,1,0,1,0,1,0,//按2 0,1,1,0,0,0,1,//按2按4 0,1,1,1,1,1,1,//不按 };//常量表 int minn[9]={0,1,2,1,1,2,1,2,0};//对应常量表8个状态最少摁的次数 int s[110]; int main() { int n,c,x,y; int q1=0,q2=0; scanf("%d%d",&n,&c); memset(s,-1,sizeof(s)); scanf("%d",&x); while(x!=-1) {s[x]=1;q1++;scanf("%d",&x);} scanf("%d",&y); while(y!=-1) {s[y]=0;q2++;scanf("%d",&y);} bool f1; for(int i=1;i<9;++i) { f1=true; for(int j=1;j<=n;++j) { if(s[j]==-1) continue; int tmp=j%6; if(tmp==0) tmp=6; if(s[j]!=li[i][tmp]) {f1=false;break;} } if(f1==true&&c>=minn[i]) { for(int j=1;j<=n;++j) { int tmp=j%6; if(tmp==0) tmp=6; printf("%d",li[i][tmp]); } printf("\n"); } } return 0; }*/

    转载请注明原文地址: https://ju.6miu.com/read-1311273.html
    最新回复(0)