数学建模社区-数学中国
标题:
求用MATLAB编写一个矩阵程序的方法
[打印本页]
作者:
yyx26
时间:
2010-12-8 14:28
标题:
求用MATLAB编写一个矩阵程序的方法
产生一个9*9的矩阵,要求满足:
(1).矩阵的每一个元素都是由数字1-9组成
(2).矩阵的每一行,每一列的数字都不许重复.
(3).若将该矩阵分成一个3*3的分快矩阵,它的每一个元素是一个3*3的小矩阵,这些小矩阵中的数字也不能重复.
(4).每运行一次程序,产生的矩阵是不一样的,即结果应具有随机性.
作者:
hy282694
时间:
2010-12-8 23:24
这不是数独么?我曾经用VC写过
作者:
753085848
时间:
2010-12-8 23:45
http://wenku.baidu.com/view/47c94e66f5335a8102d220e3.html
有这个解法的文档!
作者:
linmatsas
时间:
2010-12-9 00:06
好像就是数独捏。。。。。好难写呀。。。。。。佩服LS。。。。。
作者:
hy282694
时间:
2010-12-9 13:00
等我忙过了这一阵儿了帮你写吧,一点要MATLAB版本的么?
作者:
hy282694
时间:
2010-12-9 16:29
#include<stdio.h>
#include<stdlib.h>
int sd[81]={0};//存放数据,0表示代填数据
void search(int);
int checkrow(int,int);
int checkcol(int,int);
int checkgezi(int,int,int);
int panduan(int,int);
void print();
void main()
{
// int i;
// for(i=0;i<81;i++)//读入数据
// scanf("%d",&sd[i]);
printf("\n");
search(0);
}
void search(int m)
{
int i;
if(m>=81)//搜索完毕
{
print();
// exit(0);
printf("\n");
}
else if(sd[m]!=0)//当前位置已经填了数字
search(m+1);
else//对当前位置进行填数
{
for(i=1;i<=9;i++)//1~9一个一个的试探
{
if(panduan(m,i))
{
sd[m]=i;
search(m+1);
sd[m]=0;
}
}
}
}
int panduan(int m,int i)
{
int row,col;
int x,y,z;
row=m/9;//求行
col=m%9;//求列
x=checkrow(i,row);
y=checkcol(i,col);
z=checkgezi(i,row,col);
if(x==1&&y==1&&z==1)
return 1;
return 0;
}
int checkrow(int m,int x)//检查同行,x为行数
{
int i;
for(i=0;i<9;i++)
if(m==sd[x*9+i])
return 0;
return 1;
}
int checkcol(int m,int y)//检查同列,y为列数
{
int i;
for(i=0;i<9;i++)
if(m==sd[y+i*9])
return 0;
return 1;
}
int checkgezi(int m,int x,int y)//x是行号,y是列号
{
int checkxiaogezi(int qx,int zx,int qy,int zy,int m);
if(x>=0&&x<=2&&y>=0&&y<=2)//第一个小宫格
return checkxiaogezi(0,2,0,2,m);
if(x>=3&&x<=5&&y>=0&&y<=2)//第二个小宫格
return checkxiaogezi(3,5,0,2,m);
if(x>=6&&x<=8&&y>=0&&y<=2)//第三个小宫格
return checkxiaogezi(6,8,0,2,m);
if(x>=0&&x<=2&&y>=3&&y<=5)//第四个小宫格
return checkxiaogezi(0,2,3,5,m);
if(x>=3&&x<=5&&y>=3&&y<=5)//第五个小宫格
return checkxiaogezi(3,5,3,5,m);
if(x>=6&&x<=8&&y>=3&&y<=5)//第六个小宫格
return checkxiaogezi(6,8,3,5,m);
if(x>=0&&x<=2&&y>=6&&y<=8)//第七个小宫格
return checkxiaogezi(0,2,6,8,m);
if(x>=3&&x<=5&&y>=6&&y<=8)//第八个小宫格
return checkxiaogezi(3,5,6,8,m);
if(x>=6&&x<=8&&y>=6&&y<=8)//第九个小宫格
return checkxiaogezi(6,8,6,8,m);
}
void print()
{
int i;
for(i=0;i<81;i++)
{
printf("%d ",sd[i]);
if((i+1)%9==0)
printf("\n");
}
}
int checkxiaogezi(int qx,int zx,int qy,int zy,int m)
{
int i,j;
for(i=qx;i<=zx;i++)
for(j=qy;j<=zy;j++)
if(sd[i*9+j]==m)
return 0;
return 1;
}
作者:
hy282694
时间:
2010-12-9 16:32
上面是我年轻的时候写的VC版本。改一改就行了。可以产生所有的你需要的数独。你运行一下就行了。自己挑一个结果吧~我技术有限,就帮到这儿了。
你把他改写MATLAB版本就行了~
作者:
土豆炒豆芽
时间:
2010-12-10 00:50
楼上的很强大!
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5