回溯演算法求解橋本分數式

bingoCoder發表於2018-07-02

    題目描述: 將 1-9 九個數不重複地賦給不同的 9 個元素 ,實現形如 a/bc+d/ef=f/hi 的形式: 例:1/26+5/78=4/39 1/32+5/96=7/84 (注意:1/26+5/78=4/39 和 5/78+1/26=4/39 只能算一種解) 求滿足條件的解共有多少個?                  思路: 要用回溯法

    可見問題的解空間是9位的整陣列,其約束條件是9位數字中沒有相同的數字且必須滿足分數式的要求。為此設定a陣列,式中每一個數用一個陣列元素表示:a[1]/a[2]a[3]+a[4]/a[5]a[6] = a[7]/a[8]a[9]。同時式中三個分母分別為:

m1 = a[2]a[3] = a[2]*10+a[3];  m2 = a[5]a[6] = a[5]*10+a[6];  m3 = a[8]a[9] = a[8]*10+a[9]

    注意到等式左側兩分數交換次序只算一個解,為了避免重複,令a[1] < a[4]。

回溯程式程式碼:

#include<stdio.h>
void main()
{
	int g, i, k, s, a[10];
	long m1, m2, m3;
	i = 1;
	a[1] = 1;
	s = 0;
	while (1) 
	{
		g = 1;
		for (k = i - 1; k >= 1; k--)
		{
			if (a[i] = a[k])
			{
				g = 0;
				break;
			}
		}
		if (i == 9 && g == 1 && a[1] < a[4])
		{
			m1= a[2] * 10 + a[3];  
			m2 = a[5] * 10 + a[6];  
			m3 = a[8] * 10 + a[9];
			if (a[1] * m2*m3 + a[4] * m1*m3 == a[7] * m1*m2)
			{
				printf("(%2d)", ++s);
				printf("%d/%ld+%d/%ld = %d/%ld", a[1], m1, a[4], m2, a[7], m3);
				if (s % 2 == 0) { printf("\n"); }
			}
		}
		if (i < 9 && g == 1) 
		{ i++; a[i] = 1; continue; }
		while (a[i] == 9 && i > 1) 
		{ 
			i--; }
		if (a[i] == 9 && i == 1) 
		{
			break;
		}
		else
		{
			a[i]++;
		}
	}
	printf("共有以上%d個解。\n", s);
}



相關文章