数独 C语言

最开始的时候,先考虑是否为最后一位,忽视了最后一位是0的可能,

也忽略了,拷贝数组再处理和递归后恢复现场再进入循环,弄了好长时间

另外x行y列这个表述太差劲了,应该换成i行j列比较好些

#include<stdio.h>
int count=0;// 统计有多少种结果
void scan(int temp[][9]);
int arrange(int temp[][9],int x,int y);//组织数独
int check(int temp[][9],int x,int y,int number);//判断是否可以填入该数字
void print(int temp[][9]);
void plus( int *ptrx ,int *ptry);//进位
void minus( int *ptrx ,int *ptry);//退位
int main() {
	int sudoku[9][9]= {0};
	scan(sudoku);
	arrange(sudoku,0,0);
	if(count==0)
		printf("此数独无解");
	return 0;
}
int arrange(int sudoku[][9],int x,int y) {
	int i,j;
	int temp[9][9];
	for(i=0; i<=8; i++) {
		for(j=0; j<=8; j++) {
			temp[i][j]=sudoku[i][j];//拷贝一份
		}
	}

	if(temp[x][y]==0) {//如果为零,尝试填入
		for(i=1; i<=9; i++) {
			if(	check(temp,x,y,i)) {
				temp[x][y]=i;//可以填入就填入
				plus(&x,&y);//进位
				arrange(temp,x,y);//递归
				minus(&x,&y);//恢复现场 ,准备下一次循环
				temp[x][y]=0;
			}
		}
	} else {
		if(x==9&&y==0) {//最后一位再加一的结果
			count++;
			print(temp);
		} else {
			plus(&x,&y);//如果不是最后一位,进位
			arrange(temp,x,y);
		}

	}

}
void scan(int temp[][9]) {
	int i,j;
	for(i=0; i<=8; i++) {
		for(j=0; j<=8; j++) {
			scanf("%d",&temp[i][j]);
		}
	}
}
int check(int temp[][9],int x,int y,int number) {
	int i,j,m,n;
	for(i=0; i<=8; i++) {
		if(temp[i][y]==number)
			return 0;
	}
	for(i=0; i<=8; i++) {
		if(temp[x][i]==number)
			return 0;
	}
	//判断九宫格是否符合
	if(x==6||x==7||x==8)
		m=6;//减轻了乘除法的负担,不知道作用多大
	if(x==3||x==4||x==5)
		m=3;
	if(x==0||x==1||x==2)
		m=0;
	if(y==6||y==7||y==8)
		n=6;
	if(y==3||y==4||y==5)
		n=3;
	if(y==0||y==1||y==2)
		n=0;
	for(i=m; i<m+3; i++) {
		for(j=n; j<n+3; j++) {
			if(temp[i][j]==number)
				return 0;
		}
	}
	return 1;
}

void plus( int *ptrx ,int *ptry) {
	if(*ptry==8) {
		(*ptrx)++;
		*ptry=0;
	} else {
		(*ptry)++;
	}
}
void minus( int *ptrx ,int *ptry) {
	if(*ptry==0) {
		(*ptrx)--;
		*ptry=8;
	} else {
		(*ptry)--;
	}
}
void print(int a[][9]) {
	int i,j;
	printf("Case %d: \n",count);
	for(i=0; i<=8; i++) {
		for(j=0; j<=8; j++) {
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
时间: 2024-10-13 20:47:48

数独 C语言的相关文章

C语言学习 数独游戏

摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 Win64) 参考: 互动百科 数独 章节: 正文: 原来也用C#和Go语言写过,主要思路是暴力撞大运破解.思路什么的在程序了都注释了,不多说了.可能是没用什么先进的算法,感觉C解题速度和C#差不多(除了C#第一次运行之外),基本上出来一个数独表都不用1秒. 附完整程序: 1 /*********************

回溯法求解数独算法(C语言)

没有对输入的待解数独进行一般性验证(同一行.一列以及同一个小九宫格都不能出现重复数字) 算法利用回溯的思想: 从第一个空白处开始,找到其候选解(排除同行.同列以及同一小九宫格的所有出现过的数字,剩下未出现的数字都是候选解)的第一个值填入数独. 对第二个空白执行第一步(前面所填入的数字对此空白处有影响). 当出现某个空白的候选解个数为0时,就开始回溯,找到第一个候选解多于一个的,将其在使用的候选解设为不可取(本程序取值为-1),找到其下一个候选解,继续上面的步骤! 直到所有空白处填满,运算完成,输

c语言解数独

来自:http://my.oschina.net/lovewxm/blog/288043?p=1 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define BOOL int 5 #define FALSE 1 6 #define TRUE 0 7 8 typedef struct node 9 { 10 int col; 11 int row; 12 int value[10]; 13 } Node; 14 15 int find

go例子(二) 使用go语言实现数独游戏

例子托管于github example.go package main import ( "./sudoku" ) func main() { //var smap sudoku.Sudomap //smap = make([]byte,9) //for i:= 0; i<len(smap);i++{ //  smap[i] = make (byte,9) //} smap := sudoku.Sudomap{ {5, 3, 0, 0, 7, 0, 0, 0, 0}, {6, 0

数独解法小探

数独的游戏要求在一个9X9的格子内填入1~9的数字,使得每一行,每一列,以及九个3X3的子区域内都没有重复的数字. 稍作思索,我写出了第一种解法.从事后查询维基百科1来看,这种方法可以称之为回溯法.思路很简单,依次扫描每一个待填数字的空格: 1. 在第一个空格里面填上“1”,检查这个数字是否合法(其所在的行.列,以及3X3的子区域里不存在重复的数字).如果合法,则前进到第二个格子.否则,在这个格子里继续试2,3,… ,直到合法为止. 2. 在第二个格子里面继续填数字,从“1”开始试起,直到找到一

回溯法解数独题

近段时间用到回溯算法的地方比较多,对算法的理解也有深入.今天偶然发现一张照片,是高中时未做完的一道数独题.当时用的是"候选余数法",之后由于太麻烦,就没有做完.不过当时截图保存了,今天突然看到.那时候刚学完C语言,对汉诺塔递归都不是太理解,所以就一直拖到现在. 用C++做的,代码如下 #include<iostream> usingnamespace std;   intsudoku[9][9]={0};   //判断填在空白位置的数字在行.列上是否符合要求 boolJud

R语言中文社区历史文章整理(类型篇)

R语言中文社区历史文章整理(类型篇) R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterplots包,让你绘制不一样的图 今天再来谈谈REmap包 ggplot2你需要知道的都在这... R访问数据库管理系统(通过RODBC包和RMySQL包两种方式) NLP--自然语言处理(三)text2vec包 Rattle:数据挖掘的界面化操作 借助caret包实现特征选择的工作 R语言的高质量图形渲染

七周七语言:理解多种编程范型pdf

下载地址:网盘下载 作者简介  · · · · · · 作者简介: Bruce A. Tate RapidRed公司总裁,该公司主要为Ruby轻量级开发提供咨询.他曾任职于IBM公司,并担任过多家公司的客户解决方案总监和CTO.著作有十余本,包括荣获Jolt大奖的Better, Faster, Lighter Java. 译者简介: 戴玮 80后宅男,中科院自动化所在读博士,热爱机器学习与计算机视觉.编程喜C#.Ruby.Haskell而厌Java. 白明 Neusoft某开发部技术总监,拥有多

#2018BIT软件工程基础#个人项目:数独

一.开发时间 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划     · Estimate · 估计这个任务需要多少时间 5 6 Development 开发     · Analysis · 需求分析 (包括学习新技术) 420 840 · Design Spec · 生成设计文档 120 180 · Design Review · 设计复审 (和同事审核设计文档) 10 20 · Coding Sta