DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

james has posted 5 posts at DZone. View Full User Profile

å??六宫格匹é…?.

02.09.2006
| 2798 views |
  • submit to reddit
        å??六宫格匹é…?.

#include "stdafx.h"
#include <iostream>
#include "stdlib.h"
#include <string>
#include <fstream>
using namespace std;
/*
å??六宫格匹é…?.
数字1-16.组��为4*4的方�.�求横竖斜的数值都�相等
*/
class Sixteen
{
public:
	Sixteen();
	void arrange(int left, int right); // 列出所有的排列
	void swap(int& item1, int& item2);
	void Check(); // 检查是�符��件
	int CheckRow(int check_num); // 检查行
	int CheckCol(int check_num); // 检查列
	int CheckBias(int check_num);  // 检查斜线
	void WriteLine(string what); // 打�结果
	~Sixteen();
private:
	int ini_data[16];
	int parsed_num;
	ofstream SaveFile;
	ofstream ResultFile;
};

Sixteen::Sixteen()
{
	//	ini_data = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
	for(int i = 1; i <= 16; i++)
	{
		ini_data[i-1] = i;
	}

	SaveFile.open("e:\\temp.txt");
	ResultFile.open("e:\\result.txt");
	parsed_num = 0;

	int total_num = 1;
	cout << "一共会有 ";
	for(int i = 1; i < 16; i++)
	{
		total_num *= i;
	}
	cout << total_num << " 个排列需�处�" << endl;
}

Sixteen::~Sixteen()
{
	SaveFile.close();
	ResultFile.close();
}

void Sixteen::swap(int& item1, int& item2)
{
	int temp = item1;
	item1 = item2;
	item2 = temp;
}

void Sixteen::arrange(int left, int right)
{
	if(parsed_num++ % 10000 == 0)
	{
		cout << "We Have parsed " << parsed_num << endl;
	}

	if(left == right)
	{
		for(int i=0;i<=right;i++)
		{
			SaveFile << ini_data[i] << " ";

			Check();
		}
		SaveFile << endl;
	}
	else
	{
		for(int i=0;i<=right;i++)
		{
			swap(ini_data[left], ini_data[i]);
			arrange(left+1, right);
			swap(ini_data[i], ini_data[left]);
		}
	}
};

void Sixteen::Check()
{
	int value = 0;
	int temp_value = ini_data[0] + ini_data[1] + ini_data[2] + ini_data[3];
	if(CheckRow(temp_value) == 1) // 如果行检查了之�结果相�
	{
		WriteLine("行检查相�");
		if(CheckCol(temp_value) == 1) // 如果列检查了之�结果相�
		{
			WriteLine("列检查相�");

			if(CheckBias(temp_value) == 1) // 如果斜线检查了之�相�
			{
				WriteLine("三项检查完全符�");
			}
		}
	}
}

void Sixteen::WriteLine(string memo)
{
	ResultFile << memo << endl;
	for(int i = 0; i < 16; i++)
	{
		ResultFile << ini_data[i] << " ";
		if((i+1) % 4 == 0)
		{
			ResultFile << endl;
		}
	}
	ResultFile << endl;
}

int Sixteen::CheckRow(int temp_value)
{
	if(temp_value == ini_data[4] + ini_data[5] + ini_data[6] + ini_data[7])
	{
		if(temp_value == ini_data[8]+ini_data[9]+ini_data[10]+ini_data[11])
		{
			if(temp_value == ini_data[12]+ini_data[13]+ini_data[14]+ini_data[15])
			{
				return 1;
			}
		}
	}

	return 0;
}

int Sixteen::CheckCol(int temp_value)
{
	if(temp_value == ini_data[0] + ini_data[4] + ini_data[8] + ini_data[12])
	{
		if(temp_value == ini_data[1] + ini_data[5] + ini_data[9] + ini_data[13])
		{
			if(temp_value == ini_data[2] + ini_data[6] + ini_data[10] + ini_data[14])
			{
				if(temp_value == ini_data[3] + ini_data[7] + ini_data[11] + ini_data[15])
				{
					return 1;
				}
			}
		}
	}

	return 0;
}

int Sixteen::CheckBias(int temp_value)
{
	if(temp_value == ini_data[0] + ini_data[5] + ini_data[10] + ini_data[15])
	{
		if(temp_value == ini_data[3] + ini_data[6] + ini_data[9] + ini_data[12])
		{
			return 1;
		}
	}

	return 0;
}

int main()
{
	Sixteen* six = new Sixteen();
	six->arrange(0,15);
}