【编程练习】3*3 的矩阵,值限定为1-9不重复,已知横竖的和,和一个斜着的值,求这个矩阵



x     x     x 11
x     x     x 15
x     x     x 19

16  14   15 15

讨论贴:

http://bbs.csdn.net/topics/391816265

先求横竖斜三行的精确匹配方法:

// puzzl.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

// puzzle.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <vector>
#include <set>
#include <iostream>

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 max
vector<vector<int> > zuhe(int min,int max,int sum)
{

 vector<vector<int> > 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 <max ;++k)
    {
     if(check(i,j,k,sum))
     {
      vector<int> 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<vector<int> > filter_zuhe(int key,vector<vector<int> > temp)
{
 vector<vector<int> >::iterator iter ;
 for(iter = temp.begin(); iter!=temp.end(); )
 {
  if( (*iter)[0] != key)
   iter = temp.erase(iter);
  else
   iter ++ ;
 }

 return temp;
}

bool isOk()
{
	set<int> 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 <<endl;
				for(int j = 0;j<3;++j)
				{
					cout<<result[i][j]<<" ";
				}
			}

			return true;
		}
	}
}

void dayin()
{
	for(int i = 0;i <3; ++i)
			{
				cout <<endl;
				for(int j = 0;j<3;++j)
				{
					cout<<result[i][j]<<" ";
				}
			}

	cout<<endl;
}

void qingling()
{
	for(int i = 0;i <3; ++i)
	{
		for(int j = 0;j<3;++j)
		{
			(result[i][j]=0);
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
 vector<vector<int> > quanjiheng = zuhe(1,9,11);
 vector<vector<int> > quanjishu = zuhe(1,9,16);
 vector<vector<int> > quanjixie = zuhe(1,9,15);

 int sizeheng = quanjiheng.size();
 int sizeshu = quanjishu.size();
 int sizexie = quanjixie.size();

 int key = 0,last_key = 0;

 vector<vector<int> > quanjishufilter;
 vector<vector<int> > 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 <typename T>
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个空位,保证不同行不同列,或者不在一个斜线。就可以算出来剩下的。

时间: 2024-12-02 09:08:31

【编程练习】3*3 的矩阵,值限定为1-9不重复,已知横竖的和,和一个斜着的值,求这个矩阵的相关文章

C#编程中,已知等差数列的首项,尾项和公差,求等差数列的没一项

问题描述 这是我写的代码,语法没错误,但是运行起来总有无法处理的异常usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespacedcsl{publicpartialclassForm1:Form{publi

算法 编程-有一个M*N的0-1矩阵,对其操作以后要使每一行、每一列都只有1个1,求这个矩阵中1的最大个数?

问题描述 有一个M*N的0-1矩阵,对其操作以后要使每一行.每一列都只有1个1,求这个矩阵中1的最大个数? matlab编写,就像数字填图的游戏一样,其中的数字1-9在每一行和每一列都有唯一的一个.在一个M*N的0-1矩阵中,我想得到的是在原矩阵上操作,使其每一行和每一列都只有唯一的一个1,怎样才能使得变换后1的个数最多. 解决方案 这个问题我觉的可以转换成,求解n皇后问题,不知道对不对,楼主可以试试 解决方案二: 谢谢!感觉有点像,但是条件里面任意两个皇后都同一斜线上,这个不要,然后就是我已经

一个java文件怎么调用另一个文件的text值

问题描述 一个java文件怎么调用另一个文件的text值 例如我在JAVA文件A里面建了一个方法 public String getUser() { String s1; s1=(String)(user.getText()); return s1; } 然后我想在JAVA文件B里调用user.getText()的值,我是这样写的 public InputCardnum inputcardnum;//这是文件A的名字 创建对象 String a=inputcardnum.getUser(); 可

java网络编程-打算做一个学习辅助工具箱,求大神给点设计思路,打算用JAVA做

问题描述 打算做一个学习辅助工具箱,求大神给点设计思路,打算用JAVA做 学习辅助工具箱里包括多功能计算器,还有数字逻辑实验模拟器,矩阵算法等等小工具.求大神给点设计的详细思路跟解决方案. 解决方案 你说的这些功能都可以google到. 特别地,你可以用 site:download.csdn.net + 你需要的程序 + java,限定只在csdn下载频道查找. 多学习些google的搜索技巧,你的效率会大大提高. 解决方案二: 一个功能一个功能的实现,最后拼凑起来

40-.net如何从数据库中的一个表中取值

问题描述 .net如何从数据库中的一个表中取值 假设这是我数据库里的一张表(数据库是oracle),我该如何取得这些数将他们传给jsonObj.Rows,求教各位大神,能给个具体的实现过程吗? 解决方案 sonObj.Rows是你自己组装的json对象吧,你首先要查询数据库,这个自己看msdn把,很简单,获取值后开始组织json就行了 解决方案二: 自己读取数据后,通过服务器端代码赋值给aspx上的script标签就行,注意<%%>这种代码不能放js文件里面,必须是在aspx页面里面才能解析运

希望建立一个循环,i值从start递变到end,不知道该怎么写

问题描述 希望建立一个循环,i值从start递变到end,不知道该怎么写 假如end>start,那么可以 for(int i=start,i<=end,i++){} 假如end for(int i=start,i>=start;i--){} 有没有写法可以统一一下,不要分开来写 解决方案 1.循环前先判断, int small=end>start:start?end; int max=end>start:end?start; for(int i=small,i<=ma

json-android把一个字符串变成键值对的形式

问题描述 android把一个字符串变成键值对的形式 android客户端把一个字符串变成键值对(JSON之类的)的形式,比如:{name=张三,age=20,sex=男}..实在不明白..唉..求解答.. 解决方案 String[] arrays = new String[]{"name=张三", "age=20", "sex=男"}; JSONObject element = new JSONObject(); for(int i= 0; i

php定义一个参数带有默认值的函数实例分析

 这篇文章主要介绍了php定义一个参数带有默认值的函数,实例分析了php参数带有默认值的函数使用技巧,需要的朋友可以参考下     本文实例分析了php定义一个参数带有默认值的函数用法.分享给大家供大家参考.具体分析如下: php的函数参数可以指定默认值,指定默认值后,调用时如果不给该参数赋值,则该参数就使用默认值 ? 1 2 3 4 5 6 7 8 9 10 11 <?php function capitalize( $str, $each=TRUE ) { $str = strtolower

android-Android怎么编程实现一台手机访问另一台手机(已知ip,port和文件路径)资源?

问题描述 Android怎么编程实现一台手机访问另一台手机(已知ip,port和文件路径)资源? 两台手机在同一局域网下,手机访问服务器时服务器端时,服务器需关闭防火墙才能允许手机访问,这个我已实现.我想问手机访问手机时,是否也需要什么权限类的东西,还是我的写法有问题. 如: Tomcat下服务器端ip:192.168.1.100 ,端口8088,资源在webapps下blog/test.mp4下,那手机端可以访问:http://192.168.1.100:8088/blog/test.mp4;