想用dfs,大佬帮我!!!

P1008 [NOIP1998 普及组] 三连击

@[lwthree](/user/897873) 大哥,你这个代码的dfs一直停不下来啊,你这都死循环了
by oier04 @ 2023-09-22 19:59:34


为啥
by lwthree @ 2023-09-22 20:02:07


那咋办
by lwthree @ 2023-09-22 20:04:34


@[lwthree](/user/897873) 停一下循环呗
by oier04 @ 2023-09-22 20:32:37


简单粗暴,根本不用dfs ```cpp #include<bits/stdc++.h> using namespace std; int main() { int b,c; for(int a=123;a<=333;a++) { b=a*2; c=a*3; if((a/100+a/10%10+a%10+b/100+b/10%10+b%10+c/100+c/10%10+c%10==1+2+3+4+5+6+7+8+9)&&((a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10)==(1)*(2)*(3)*(4)*(5)*(6)*(7)*(8)*(9))) { cout<<a<<' '<<b<<' '<<c<<endl; } } return 0; } ```
by oier04 @ 2023-09-22 20:39:42


@[lwthree](/user/897873) 在上课来不及看,只发个代码
by oier04 @ 2023-09-22 20:40:42


哦 那我等其他有时间的佬吧
by lwthree @ 2023-09-22 20:47:10


@[lwthree](/user/897873) 帮你改好了,等我写一下注释。
by guyushi0831 @ 2023-09-26 18:37:15


```cpp #include <bits/stdc++.h> using namespace std; /*问题所在: 1.规定了每个数字只能选一次 2.output下标错误:有效下标为1~9,而您写的output下标为0~8,答案错误 */ int nums[10]; bool vis[10];//bool类型有两种状态:0和1,空间足够的话可以用int代替,如果vis[i]==1说明i这个数在之前被选过 void output() { for (int i=0;i<3;i++) { for (int j=1;j<=3;j++) { printf("%d",nums[i*3+j]); } printf(" "); } printf("\n"); }//此函数修改完毕 void dfs(int n) { for (int i=1;i<=9;i++) { if (vis[i]==0)//由于前面回溯过了,所以这里不需要判nums[n]==0,直接判i是否没被选过即可 { vis[i]=1;//标记选过 nums[n]=i; if (n==9) { if ((nums[1]*100+nums[2]*10+nums[3])*2==(nums[4]*100+nums[5]*10+nums[6])&&(nums[1]*100+nums[2]*10+nums[3])*3==(nums[7]*100+nums[8]*10+nums[9]))//判断无误 { output(); //这里return应该也可以 } nums[n]=0; vis[i]=0; continue;//下一步就超界了,就跳到下一次循环,不要递归了,所以提前回溯 } dfs(n+1);//没超限就递归下去 nums[n]=0; vis[i]=0; } } } int main() { dfs(1); return 0; } ``` **总的来说,看得出来您学OI不久(应该吧),祝愿你坚持下去,学的越来越好。**
by guyushi0831 @ 2023-09-26 18:47:12


啊这,那个不可以return
by guyushi0831 @ 2023-09-26 18:50:21


| 下一页