蓝桥杯 猜算式

题目描述:

看下面的算式:
□□ x □□ = □□ x □□□
它表示:两个两位数相乘等于一个两位数乘以一个三位数。
如果没有限定条件,这样的例子很多。
但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。
该算式中1至9的每个数字出现且只出现一次!

比如:
46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
.....
请编程,输出所有可能的情况!

注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要


解题思路:

此题为搜索题,将上述四个数用a,b,c,d表示,这四个数一共九位,每位是1-9这九个数中的一个,所以每确定一组数dfs九次,每次将1-9这九个数都试探一下,并记录a,b,c,d的具体值,记录方式为id=1,表示a的十位;id=2,表示个位,以此类推。

注意:每组dfs后需要把访问标记数组以及a,b,c,d,还原为前面的状态。


代码如下:

<pre name="code" class="cpp">#include<iostream>
#include<string.h>
using namespace std;
int a,b,c,d;     //a*b=c*d
bool visit[10];  //访问标记数组
bool com[10000];  //判断a与b的积是否出现过
void dfs(int id)  //id表示到了那个数的哪一位
{
    if(id==10)    //一组数记录完成,判断是否能实现a*b=c*d
    {
        if(a*b==c*d&&com[a*b]==0)
        {
            cout<<a<<"*"<<b<<"="<<c<<"*"<<d<<endl;
            com[a*b]=1;  
        }
        else
            return;
    }
    for(int i=1; i<=9; i++)
    {
        if(visit[i]==0)
        {
            if(id==1)
                a=i*10;
            if(id==2)
                a+=i;
            if(id==3)
                b=i*10;
            if(id==4)
                b+=i;
            if(id==5)
                c=i*10;
            if(id==6)
                c+=i;
            if(id==7)
                d=i*100;
            if(id==8)
                d+=i*10;
            if(id==9)
                d+=i;
            visit[i]=1;
            dfs(id+1);
            visit[i]=0;
            if(id==2)
                a-=i;
            if(id==4)
                b-=i;
            if(id==6)
                c-=i;
            if(id==8)
                d-=i*10;
            if(id==9)
                d-=i;
        }
    }
}
int main()
{
    memset(visit,0,sizeof(visit));
    memset(com,0,sizeof(com));
    dfs(1);
}


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值