3、三羊献瑞
题目 三羊献瑞
思路分析
可以直接暴力枚举每个数
可以观察一下
三能进到五位 说明他一定是1
再往后分析 祥+三(1)能进位 说明一定是9 然后羊一定是0
后面就分析不出什么了 直接循环加上
验算一下就行了 因为它说答案唯一
这道题刷真题卷的时候用的是纯暴力把每个数都套1~9
代码极其夸张
其实可以套用dfs全排列枚举的思路 因为每个字都在0~9之间 且不重复
所以可以先做出全排列 再想办法套给每个字
代码实现
暴力枚举解法
#include<bits/stdc++.h>
using namespace std;
int main()
{
int xiang,rui,sheng,hui,san,yang,xian,qi;
san=1;
int num1,num2,res;
for(xiang=0;xiang<=9;xiang++){
for(rui=0;rui<=9;rui++){
for(sheng=0;sheng<=9;sheng++){
for(hui=0;hui<=9;hui++){
for(yang=0;yang<=9;yang++){
for(xian=0;xian<=9;xian++){
for(qi=0;qi<=9;qi++){
if(xiang!=rui && xiang!=sheng && xiang!=hui && xiang!=san && xiang!=yang && xiang!=xian && xiang!=qi
&&
rui!=sheng && rui!=hui && rui!=san && rui!=yang && rui!=xian && rui!=qi
&&
sheng!=hui && sheng!=san && sheng!=yang && sheng!=xian && sheng!=qi
&&
hui!=san && hui!=san && hui!=yang && hui!=xian && hui!=qi
&&
yang!=san && yang!=xian && yang!=qi
&&
xian!=qi && xian!=san
&&
qi!=san){
num1=xiang*1000+rui*100+sheng*10+hui;
num2=san*1000+yang*100+xian*10+rui;
res=san*10000+yang*1000+sheng*100+rui*10+qi;
if(res==num1+num2)
cout<<san<<yang<<xian<<rui<<endl;
}
}
}
}
}
}
}
}
return 0;
}
dfs暴搜
#include<bits/stdc++.h>
using namespace std;
const int N=10;
int alls[N];
bool st[N];
int ans;
void dfs(int u){
if(u==9){
int A=alls[0]*1000+alls[1]*100+alls[2]*10+alls[3];
int B=alls[4]*1000+alls[5]*100+alls[6]*10+alls[1];
int C=alls[4]*10000+alls[5]*1000+alls[2]*100+alls[1]*10+alls[7];
if(A+B==C && B>1000)
ans=B;
return;
}
for(int i=0;i<=9;i++){
if(!st[i]){
st[i]=true;
alls[u]=i;
dfs(u+1);
alls[u]=0;
st[i]=false;
}
}
}
int main()
{
dfs(0);
cout<<ans;
return 0;
}
next_permutation
#include<bits/stdc++.h>
using namespace std;
vector<int> alls={0,1,2,3,4,5,6,7,8,9};
int main()
{
do{
int A=alls[0]*1000+alls[1]*100+alls[2]*10+alls[3];
int B=alls[4]*1000+alls[5]*100+alls[6]*10+alls[1];
int C=alls[4]*10000+alls[5]*1000+alls[2]*100+alls[1]*10+alls[7];
if(A+B==C && B>1000){
cout<<B;
return 0;
}
}while(next_permutation(alls.begin(),alls.end()));
return 0;
}
💬 评论