求助!暴力枚举22分,错了7个点

P1213 [USACO1.4] [IOI1994]时钟 The Clocks

@[夏天禹](/user/253680) 我看看
by phil071128 @ 2020-08-25 15:18:18


@[夏天禹](/user/253680) ```cpp for(int i1=0;i1<=3;i1++){ for(int i2=0;i2<=3;i2++){ for(int i3=0;i3<=3;i3++){ for(int i4=0;i4<=3;i4++){ for(int i5=0;i5<=3;i5++){ for(int i6=0;i6<=3;i6++){ for(int i7=0;i7<=3;i7++){ for(int i8=0;i8<=3;i8++){ for(int i9=0;i9<=3;i9++){ if((i1+i2+i4 )%4==(4-a[1])) if((i1+i2+i3+i5 )%4== (4-a[2])) if(( i6+i2+i3 )%4 == (4-a[3])) if(( i1+i4+i7+i5 )%4 == (4-a[4]) ) if(( i3+i5+i9+i1+i7 )%4 == (4-a[5])) if(( i3+i5+i9+i6 )%4== (4-a[6])) if(( i7+i4+i8 )%4== (4-a[7])) if(( i8+i5+i9+i7 )%4==(4-a[8])) if(( i6+i8+i9 )%4== (4-a[9])){ b[1]=i1; b[2]=i2; b[3]=i3; b[4]=i4; b[5]=i5; b[6]=i6; b[7]=i7; b[8]=i8; b[9]=i9; //忘用数组 for(int i=1;i<=9;i++){ for(int j=1;j<=b[i];j++){ cout<<i<<" "; } } } } } } } } } } } } ```
by phil071128 @ 2020-08-25 15:19:26


@[夏天禹](/user/253680) 建议您改用数组,不然有点乱,您看一下是不是最后i9的问题.
by phil071128 @ 2020-08-25 15:21:38


@[phil071128](/user/306734) 谢谢dalao,刚刚我忘记加for循环了。。。一个超级低级错误QAQ
by HackerDsg @ 2020-08-25 15:28:23


现在过了,蟹蟹orz
by HackerDsg @ 2020-08-25 15:28:56


@[夏天禹](/user/253680) 啊这,我发现我们做的题都好像(这道题我前天刚做了)
by phil071128 @ 2020-08-25 15:29:07


首先,按照你这个顺序找到的最小次数不一定是最小的…… 其次,你没发现自己输出写错了吗? 不管i是啥都只输出一次?
by syf1201 @ 2020-08-25 15:33:30


建议递归优化码量 ```c #include<cstdio> using namespace std; const int mv[10][5]={{0,0,0,0,0},{0,1,2,4,5},{0,0,1,2,3},{0,2,3,5,6},{0,0,1,4,7},{2,4,5,6,8},{0,0,3,6,9},{0,4,5,7,8},{0,0,7,8,9},{0,5,6,8,9}}; int a[15],num[15]; bool flag; bool check() { for(int i=1; i<=9; i++) if(a[i]!=0) return 0; return 1; } void write(int x) { for(int i=1; i<9; i++) for(int j=1; j<=num[i]; j++) printf("%d ",i); for(int i=1; i<=x; i++) printf("9 "); } void dfs(int x,int y) { if(y<0) return; if(x==9) { for(int j=0; j<5; j++) { a[mv[9][j]]+=y; a[mv[9][j]]%=4; } if(check()) { flag=1; write(y); } for(int j=0; j<5; j++) { a[mv[9][j]]-=y-4; a[mv[9][j]]%=4; } return; } for(int i=0; i<4; i++) { num[x]=i; for(int j=0; j<5; j++) { a[mv[x][j]]+=i; a[mv[x][j]]%=4; } dfs(x+1,y-i); if(flag) return; for(int j=0; j<5; j++) { a[mv[x][j]]-=i-4; a[mv[x][j]]%=4; } } } int main() { for(int i=1; i<=9; i++) { scanf("%d",&a[i]); a[i]/=3; } for(int i=0; i<=27; i++) { if(flag) continue; dfs(1,i); } return 0; } ```
by syf1201 @ 2020-08-25 15:58:45


|