【编程练习】3*3 的矩阵,值限定为1-9不重复,已知横竖的和,和一个斜着的值,求这个矩阵...
本文共 3527 字,大约阅读时间需要 11 分钟。
x x x 11
x x x 15
x x x 19
16 14 15 15
讨论贴:
先求横竖斜三行的精确匹配方法:
// puzzl.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"// puzzle.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include using namespace std;int result[3][3] = {0};bool check(int a, int b, int c, int sum){ if((a + b + c )== sum) return true; else return false;}int lastValue(int a, int b,int sum){ return (sum - a - b);}//min maxvector > zuhe(int min,int max,int sum){ vector > quanji; for(int i = min;i < max; ++i) { for(int j = 1;j < max; ++j) { if(i + j > sum) continue; else { for(int k = 1; k
ziji; ziji.push_back(i); ziji.push_back(j); ziji.push_back(k); if (i!=j&&j!=k&&i!=k) { quanji.push_back(ziji); } } else { continue; } } } } } return quanji;}vector
> filter_zuhe(int key,vector > temp){ vector >::iterator iter ; for(iter = temp.begin(); iter!=temp.end(); ) { if( (*iter)[0] != key) iter = temp.erase(iter); else iter ++ ; } return temp;}bool isOk(){ set mySet; for(int i = 0;i <3; ++i) { for(int j = 0;j<3;++j) { if(result[i][j]>0&&result[i][j]<10) { mySet.insert(result[i][j]); } } } if(mySet.size()!=9) {return false;} else { if(mySet.size()==9) { for(int i = 0;i <3; ++i) { cout < <3; ++i) { cout < <3; ++i) { for(int j = 0;j<3;++j) { (result[i][j]=0); } }}int _tmain(int argc, _TCHAR* argv[]){ vector > quanjiheng = zuhe(1,9,11); vector > quanjishu = zuhe(1,9,16); vector > quanjixie = zuhe(1,9,15); int sizeheng = quanjiheng.size(); int sizeshu = quanjishu.size(); int sizexie = quanjixie.size(); int key = 0,last_key = 0; vector > quanjishufilter; vector > quanjixiefilter; for(int i = 0;i < sizeheng ; ++i) { key = quanjiheng[i][0]; if (key!=last_key) { quanjishufilter = filter_zuhe(key,quanjishu); quanjixiefilter = filter_zuhe(key,quanjixie); } last_key = key; //给横行赋值 for (int j = 0;j< 3;++j) { result[0][j] = quanjiheng[i][j]; } int sizeshu = quanjishufilter.size(); for (int k = 0; k< sizeshu;++k) { //给竖行赋值 for(int j = 0;j<3;++j) { result[j][0] = quanjishufilter[k][j]; } int sizexie = quanjixiefilter.size(); for(int x = 0; x < sizexie; ++x) { for(int j = 0; j < 3 ;++j) { result[j][j] = quanjixiefilter[x][j]; } result[2][1] = 14 - result[0][1]-result[1][1]; result[1][2] = 15- result[1][0]-result[1][1]; if(isOk()) { //dayin(); getchar(); //return 0; } else { } } } qingling(); } getchar(); system("pause"); return 0;} 排列组合的方法:
template void swap(T* array, unsigned int i, unsigned int j){ T t = array[i]; array[i] = array[j]; array[j] = t;}void FullArray(int* array, size_t array_size, unsigned int index){ if (index >= array_size) { if ((array[0] + array[1] + array[2] == 11) && (array[3] + array[4] + array[5] == 15) && (array[6] + array[7] + array[8] == 19) && (array[0] + array[3] + array[6] == 16) && (array[1] + array[4] + array[7] == 14) && (array[2] + array[5] + array[8] == 15) && (array[0] + array[4] + array[8] == 15)) { printf("%d,%d,%d\n", array[0], array[1], array[2]); printf("%d,%d,%d\n", array[3], array[4], array[5]); printf("%d,%d,%d\n\n", array[6], array[7], array[8]); } return; } for (unsigned int i = index; i < array_size; ++i) { swap(array, i, index); FullArray(array, array_size, index + 1); swap(array, i, index); }}int main(int argc, char* argv[]){ int value[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; FullArray(value, 9, 0);}
模仿人做的方法,任意填写3个空位,保证不同行不同列,或者不在一个斜线。就可以算出来剩下的。