@[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