三羊献瑞:dfs / next_permutation()

三羊献瑞

观察下面的加法算式:

       祥 瑞 生 辉
  +   三 羊 献 瑞
-------------------
   三 羊 生 瑞 气

(如果有对齐问题,可以参看【图1.jpg】)

其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

 题目描述:答案1085

dfs:

#include <stdio.h>

int a[] = {0,1,2,3,4,5,6,7,8,9};
void test(int a[])
{
	if(a[0]==9&&a[4]==1){
 	int x=1000*a[0]+100*a[1]+10*a[2]+a[3];
 	int y=1000*a[4]+100*a[5]+10*a[6]+a[1];
 	int z=10000*a[4]+1000*a[5]+100*a[2]+10*a[1]+a[7];
    if(x+y==z) 
    	printf("%d + %d = %d\n", x,y,z);	
	}
}

void dfs(int a[], int k)
{
    int i,t;
    if(k>=9){
        test(a);
        return;
    }
    
    for(i=k; i<10; i++){
        {t=a[k]; a[k]=a[i]; a[i]=t;}
        dfs(a,k+1);
        {t=a[k]; a[k]=a[i]; a[i]=t;} // 回溯
    }
}
    
int main()
{
    dfs(a,0);    
    return 0;
}

next_permutation():

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<math.h>
  
using namespace std;
int main()
{
    int a[]={0,1,2,3,4,5,6,7,8,9};
    do{
        if(a[4]==1&&a[0]==9){
            int x=1000*a[0]+100*a[1]+10*a[2]+a[3];
            int y=1000*a[4]+100*a[5]+10*a[6]+a[1];
            int z=10000*a[4]+1000*a[5]+100*a[2]+10*a[1]+a[7];
            if(x+y==z){
            printf("%d+%d=%d\n",x,y,z);
            break;
            }
        }
    }while(next_permutation(a,a+10));
     
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/52dxer/p/10569599.html