0
点赞
收藏
分享

微信扫一扫

HDU杭电1426-Realtime Status 数独问题


题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1426

/****************************

第一次做数独问题,没做之前觉得就是一个搜索题,然而写起代码来就错误重重了!

问号的输入我用了字符串接收(%s),详见代码。

dfs。深搜即可

在提交题目时注意,不同的示例之间空一行。最后结束前的一组后面没有空行。


我的代码提交时间是889MS,效率欠佳。

/******************************************

代码如下:

/*****************


#include<stdio.h>

int map[10][10];
int w[88];//记录问号位置
int e; //记录问号个数 
int myscanf()//矩阵的输入
{
	e=0;
	char x[3];
	for(int i=1;i<=9;i++)
	for(int j=1;j<=9;j++)
	{
				
		if(scanf("%s",x)==EOF)
			return 0;
		if(x[0]!='?')
		{
			map[i][j]=x[0]-'0';
		}
		else
		{
			map[i][j]=0;//代表问号
			w[e++]=i*10+j;	
		}
	}
	return 1; 
} 

void output()
{
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=8;j++)
		{
			printf("%d ",map[i][j]);
		}
		printf("%d\n",map[i][9]);
	}
	
}


int ok(int a,int b,int k)//检查k能否填在位置ab 
{
	for(int i=1;i<=9;i++)//检查行
	{
		if(k==map[a][i])return 0;
	}	
	for(int i=1;i<=9;i++)//检查列
	{
		if(k==map[i][b])return 0;
	}	
	a=(a-1)/3*3+1;
	b=(b-1)/3*3+1;
	for(int i=a;i<=a+2;i++)//检查小九宫格
	{
		for(int j=b;j<=b+2;j++)
		{
			if(k==map[i][j])return 0;
		}
	}
	
	return 1;
}

void dfs(int a)//w[a]的十位数和个位数代表位置
{
	int k=w[a]/10,l=w[a]%10;
	
	if(a==e)//全填完了
	{
		output();
		return;
	}
	
	//填数
	for(int i=1;i<=9;i++)//把i填进去 
	{
	
		if(ok(k,l,i))//i可以填在此处 
		{
			map[k][l]=i;
			
			dfs(a+1);
			
			map[k][l]=0;
		}
	}
}


int main()
{
	int flag=0;
	while(myscanf())//矩阵输入 
	{
		
		if(flag++)
			puts("");//空行的输出
		
		dfs(0);
	}
	return 0;
}





举报

相关推荐

0 条评论