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
å??å…å®«æ ¼åŒ¹é…?.
å??å…å®«æ ¼åŒ¹é…?.
#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);
}





