寒假作业---蓝桥杯---DFS

         题目描述

现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:

每个方块代表1~13中的某一个数字,但不能重复。
比如:
6  + 7 = 13
9  - 8 = 1
3  * 4 = 12
10 / 2 = 5
以及: 
7  + 6 = 13
9  - 8 = 1
3 * 4 = 12
10 / 2 = 5
就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?
答案:64
 
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
double a[4][3];
int vis[15];
int ans=0;
int check(int x,int y,int num)
{
    if(x==0&&y<2)
        return 1;
    if(x==0&&y==2)
    {
        if(a[0][0]+a[0][1]==num)
            return 1;
        else
            return 0;
    }
    if(x==1&&y<2)
        return 1;
    if(x==1&&y==2)
    {
        if(a[1][0]-a[1][1]==num)
            return 1;
        else
            return 0;
    }
    if(x==2&&y<2)
        return 1;
    if(x==2&&y==2)
    {
        if(a[2][0]*a[2][1]==num)
            return 1;
        else
            return 0;
    }
    if(x==3&&y<2)
        return 1;
    if(x==3&&y==2)
    {
        if(a[3][0]/a[3][1]==num)//-------注意除法的时候要用double,否则会多算好多
            return 1;
        else
            return 0;
    }
    return 0;

}
void dfs(int x,int y)
{
    if(x==4)
    {
        ans++;
        // for(int i=0;i<4;i++)
        // {
        //     for(int j=0;j<3;j++)
        //         cout<<a[i][j]<<' ';
        //     cout<<endl;
        // }
        return ;
    }
    if(y>=3)
        dfs(x+1,0);
    for(int i=1;i<=13;i++)
    {
        if(vis[i]==0&&check(x,y,i))
        {
            a[x][y]=i;
            vis[i]=1;
            dfs(x,y+1);
            vis[i]=0;
        }
    }
}
int main()
{
    memset(vis,0,sizeof(vis));
    dfs(0,0);
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/-citywall123/p/12305341.html