1 2 #include "stdafx.h" 3 #include <iostream> 4 #include "stdlib.h" 5 #include <string> 6 #include <fstream> 7 using namespace std; 8 /* 9 å??å…å®«æ ¼åŒ¹é…?. 10 æ•°å—1-16.组å?ˆæˆ?为4*4的方å?—.è¦?求横竖斜的数值都è¦?ç›¸ç‰ 11 */ 12 class Sixteen 13 { 14 public: 15 Sixteen(); 16 void arrange(int left, int right); // 列出所有的排列 17 void swap(int& item1, int& item2); 18 void Check(); // 检查是å?¦ç¬¦å?ˆæ?¡ä»¶ 19 int CheckRow(int check_num); // 检查行 20 int CheckCol(int check_num); // 检查列 21 int CheckBias(int check_num); // 检查斜线 22 void WriteLine(string what); // 打å?°ç»“æžœ 23 ~Sixteen(); 24 private: 25 int ini_data[16]; 26 int parsed_num; 27 ofstream SaveFile; 28 ofstream ResultFile; 29 }; 30 31 Sixteen::Sixteen() 32 { 33 // ini_data = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 34 for(int i = 1; i <= 16; i++) 35 { 36 ini_data[i-1] = i; 37 } 38 39 SaveFile.open("e:\\temp.txt"); 40 ResultFile.open("e:\\result.txt"); 41 parsed_num = 0; 42 43 int total_num = 1; 44 cout << "一共会有 "; 45 for(int i = 1; i < 16; i++) 46 { 47 total_num *= i; 48 } 49 cout << total_num << " 个排列需è¦?处ç?†" << endl; 50 } 51 52 Sixteen::~Sixteen() 53 { 54 SaveFile.close(); 55 ResultFile.close(); 56 } 57 58 void Sixteen::swap(int& item1, int& item2) 59 { 60 int temp = item1; 61 item1 = item2; 62 item2 = temp; 63 } 64 65 void Sixteen::arrange(int left, int right) 66 { 67 if(parsed_num++ % 10000 == 0) 68 { 69 cout << "We Have parsed " << parsed_num << endl; 70 } 71 72 if(left == right) 73 { 74 for(int i=0;i<=right;i++) 75 { 76 SaveFile << ini_data[i] << " "; 77 78 Check(); 79 } 80 SaveFile << endl; 81 } 82 else 83 { 84 for(int i=0;i<=right;i++) 85 { 86 swap(ini_data[left], ini_data[i]); 87 arrange(left+1, right); 88 swap(ini_data[i], ini_data[left]); 89 } 90 } 91 }; 92 93 void Sixteen::Check() 94 { 95 int value = 0; 96 int temp_value = ini_data[0] + ini_data[1] + ini_data[2] + ini_data[3]; 97 if(CheckRow(temp_value) == 1) // 如果行检查了之å?Žç»“果相å?Œ 98 { 99 WriteLine("行检查相å?Œ"); 100 if(CheckCol(temp_value) == 1) // 如果列检查了之å?Žç»“果相å?Œ 101 { 102 WriteLine("列检查相å?Œ"); 103 104 if(CheckBias(temp_value) == 1) // 如果斜线检查了之å?Žç›¸å?Œ 105 { 106 WriteLine("三项检查完全符å?ˆ"); 107 } 108 } 109 } 110 } 111 112 void Sixteen::WriteLine(string memo) 113 { 114 ResultFile << memo << endl; 115 for(int i = 0; i < 16; i++) 116 { 117 ResultFile << ini_data[i] << " "; 118 if((i+1) % 4 == 0) 119 { 120 ResultFile << endl; 121 } 122 } 123 ResultFile << endl; 124 } 125 126 int Sixteen::CheckRow(int temp_value) 127 { 128 if(temp_value == ini_data[4] + ini_data[5] + ini_data[6] + ini_data[7]) 129 { 130 if(temp_value == ini_data[8]+ini_data[9]+ini_data[10]+ini_data[11]) 131 { 132 if(temp_value == ini_data[12]+ini_data[13]+ini_data[14]+ini_data[15]) 133 { 134 return 1; 135 } 136 } 137 } 138 139 return 0; 140 } 141 142 int Sixteen::CheckCol(int temp_value) 143 { 144 if(temp_value == ini_data[0] + ini_data[4] + ini_data[8] + ini_data[12]) 145 { 146 if(temp_value == ini_data[1] + ini_data[5] + ini_data[9] + ini_data[13]) 147 { 148 if(temp_value == ini_data[2] + ini_data[6] + ini_data[10] + ini_data[14]) 149 { 150 if(temp_value == ini_data[3] + ini_data[7] + ini_data[11] + ini_data[15]) 151 { 152 return 1; 153 } 154 } 155 } 156 } 157 158 return 0; 159 } 160 161 int Sixteen::CheckBias(int temp_value) 162 { 163 if(temp_value == ini_data[0] + ini_data[5] + ini_data[10] + ini_data[15]) 164 { 165 if(temp_value == ini_data[3] + ini_data[6] + ini_data[9] + ini_data[12]) 166 { 167 return 1; 168 } 169 } 170 171 return 0; 172 } 173 174 int main() 175 { 176 Sixteen* six = new Sixteen(); 177 six->arrange(0,15); 178 }
You need to create an account or log in to post comments to this site.