解いてみた

問題はこちらを参照してください。http://twitpic.com/4zkehk


まぁ普通に実際にやってみて10分くらいで解けたんですが、どうしてもこういうのを見るとプログラム的解法で全解探索してみたくなるのが人間性ってもんじゃないですか(え)。
そんなわけで、書いてみました。

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
	int i, first, second, third, fourth, fifth;
	int N[] = {1,2,3,4,5,6,7,8,9};
	do {
		first = 10 * N[0] + N[1];
		second = N[2];
		third = 10 * N[3] + N[4];
		fourth = 10 * N[5] + N[6];
		fifth = 10 * N[7] + N[8];
		if((first * second == third) && (third + fourth == fifth)){
			for(i = 0; i < 9; i++){
				cout << N[i] << " ";
			}
			cout << endl;
		}
	} while (next_permutation(N, N+9));
	return 0;
}

問題解くのにC++使ったの初めてだ。
順列の全列挙を9重ループ使わずにどうするかということで、うまい方法が思いつかなかったので(この時点でアルゴリズム力が以下略)Twitterで聞いたところSTLstd::next_permutation使うのがいいよと言われたのでC++で解くことにしてみました。これの中身に関する個人的な疑問解決の章はあとで書くことにしましょうか。


全解探索して答えが1個しか出てこないってことは相当よくできた問題ですね。自分はN[0]とN[7]に関してアタリをつけて、N[3]への繰り上がりもある程度アタリをつけていろいろ実験して解いたんですが、これを「確実にこれしかないよ!」と全解探索以外で絞り込める方法ってなんかあるんですかね…?