数学建模社区-数学中国

标题: 求用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