Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
初级会员
注册日期: 2010-08-25
帖子: 1
声望力: 0 ![]() |
![]()
大家好,我收到一个QQ搜搜的援助,但是我不知道如何把C转化成MATLAB,有谁可以帮忙的请直接到http://wenwen.soso.com/z/q216168970....��码如下:
#include<stdio.h> int map[9][9]={0,0,3,8,1,0,0,0,9, 5,0,0,4,0,0,0,8,0, 0,6,0,9,0,0,1,0,0, 0,0,8,0,3,0,0,0,6, 0,0,0,0,0,0,0,0,0, 9,0,0,6,0,0,5,0,0, 0,0,6,0,0,9,0,1,0, 0,1,0,0,0,5,0,0,4, 2,0,0,0,4,8,7,0,0}; void display() { int i; int j; for(i=0;i<9;i++) { for(j=0;j<9;j++) { if(map[i][j]) { printf("<%d>",map[i][j]); } else { printf("< >"); } } printf("\n"); } } int check(int x,int y,int *mark)//check函数为该格子可以选择的数字 { int i; int j; int gi; int gj; int count = 0; for(i=1;i<=9;i++) { mark[i]=0;//初始化 } for(i=0;i<9;i++) { mark[map[x][i]]=1; //表示该行该数字已存在 mark[map[i][y]]=1; //表示该列该数字已存在 } gi=x/3*3;//九宫格把map分割成9个小块,如果该格子所在行列为(1,4),那么它所在子格子起始为(0,3)到(2,5)的九个小格子 gj=y/3*3; for(i=0;i<3;i++) { for(j=0;j<3;j++) { mark[map[gi+i][gj+j]]=1;//此循环为表示所在子格子的九个小格子中已存在该数字 } } for (i=1;i<=9;i++) { if(0==mark[i]) //如果该数字不存在则++ { count++; } } return count; } void crack()//? { int i; int j; int mark[10]; //标志数字是否已存在 int min=10; //记录最少可能数字数 int ci=-1; //ci,cj用来记录最少可能数字的格子所在行列 int cj; for (i=0;i<9;i++) { for(j=0;j<9;j++) { if(map[i][j]) { continue; //如果该格子已有数字则跳到下一个格子 } int c=check(i,j,mark); //c为该格子可以选择的数字 if(0==c) { return; } if(c<min) { ci=i; cj=j; min=c; } } } if(-1==ci) { printf("The answer is:\n"); display(); return; } check(ci,cj,mark);//这个语句的作用是把mark这个数组设置成最小可能格子缺少的数字,若缺少则为0 for(i=1;i<=9;i++) { if(mark[i]==0) { map[ci][cj]=i; //先填入该数字 crack(); //进行判断 } map[ci][cj]=0; //若这个数字不可以得到解则判断下一可能数字(这里类似0-1背包问题) } } int main() { printf("The game is:\n"); display(); crack(); return 0; } |
![]() |
![]() |