神奇矩阵-二维数组的应用

神奇矩阵:
| 2 | 9| 4 |
| 7 | 5 | 3 |
| 6 | 1 | 8 |
令矩阵的每行每列之和都为15:
解法:2, 4, 6, 8,这四个数,正好占据了矩形的四个角,我们采用填充方法将方格填完

填充规律:在第一行中间填1,然后1的右上角即为2的位置(行越界则移动到最后一行,2的右上角
即为3的位置,一直到碰到已填的数字为止)此时数字向下填,填好后将次序列进行如反转和镜像即完成。

#include<iostream>
using namespace std;
int a[3][3],b[3][3];

int main()
{	
	int i,tx,ty;
	int x=0,y=1;
	a[0][1]=1;//将1放在第0行第1列
	for(i=2;i<=9;i++)//依次放2->9
	{
		tx=(x+1)%3;
		ty=(y+1)%3;
		if(a[tx][ty]==0)//如果斜上未填数字
		{
			a[tx][ty]=i;//x为行,y为列
			x=tx;
			y=ty;
		}
		else//否则填数到下方
		{
			x=(x+1)%3;
			a[x][y]=i;
		}
	}
	for(i=0;i<=3;i++)
	{
		cout<<a[0][0]<<a[0][1]<<a[0][2]<<endl;
		cout<<a[1][0]<<a[1][1]<<a[1][2]<<endl;
		cout<<a[2][0]<<a[2][1]<<a[2][2]<<endl;
		cout<<endl;
		cout<<a[2][0]<<a[2][1]<<a[2][2]<<endl;//上下翻转
		cout<<a[1][0]<<a[1][1]<<a[1][2]<<endl;
		cout<<a[0][0]<<a[0][1]<<a[0][2]<<endl;
		cout<<endl;
	
	for(int ii=0;ii<3;ii++)//借助辅助数组b进行旋转
		for(int jj=0;jj<3;jj++)
			b[jj][2-ii]=a[ii][jj];
	for(int ii=0;ii<3;ii++)
		for(int jj=0;jj<3;jj++)
			a[ii][jj]=b[ii][jj];
	}
	system("pause");
	return 0;
}

方法二:函数递归

#include<iostream>
using namespace std;
int a[10]={0,0,0,0,0,5,0,0,0,0},j,num=0;

int fun(int m)
{
	int i;
	if(m==5)
		for(j=1;j<=3;j++)
			if(a[j]+a[j+3]+a[j+6]!=15||a[3*j]+a[3*j-1]+a[3*j-2]!=15)
				return 0;
	cout<<a[1]<<a[2]<<a[3]<<endl;
	cout<<a[4]<<a[5]<<a[6]<<endl;
	cout<<a[7]<<a[8]<<a[9]<<endl;
	++num;
	else 
		for(i=1;i<=9;i++)
		{
			if(a[i]==0)
			{
				a[i]=m;
				a[10-i]=10-m;
				fun(m+1);//注意此处恢复
				a[i]=0;
				a[10-i]=0;
			}
		}
}
int main()
{	
	int m=1;
	fun(m);
	cout<<num<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值