列表

详情


NC50020. 数独游戏

描述

KM喜欢数独,你的任务是帮他完成这个数独。

输入描述

输入一个9*9的方阵。

输出描述

输出完成的数独

示例1

输入:

5 3 0 0 7 0 0 0 0
6 0 0 1 9 5 0 0 0
0 9 8 0 0 0 0 6 0
8 0 0 0 6 0 0 0 3
4 0 0 8 0 3 0 0 1
7 0 0 0 2 0 0 0 6
0 6 0 0 0 0 2 8 0
0 0 0 4 1 9 0 0 5
0 0 0 0 8 0 0 7 9

输出:

5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 11ms, 内存消耗: 416K, 提交时间: 2022-10-10 20:23:10

#include<iostream>
using namespace std;
bool sign=false;
int num[9][9];
void Input();
void Output();
bool Check(int n,int key);
int D(int n);
int main()
{
	Input();
	D(0);
	Output();
}
void Input()
{
	char temp[9][9];
	for(int i=0;i<9;i++)
	{
		for(int j=0;j<9;j++)
		{
			cin>>temp[i][j];
			num[i][j]=temp[i][j]-'0';
		}
	}
}

void Output()
{
	for(int i=0;i<9;i++)
	{
		for(int j=0;j<9;j++)
		{
			cout<<num[i][j]<<" ";
		}
		cout<<endl;
		}
	}

bool Check(int n,int key)
{
	int i;
	for(i=0;i<9;i++)
	{
		int j=n/9;
		if(num[j][i]==key)return false;
	}
for(i=0;i<9;i++)
{
	int j=n%9;
	if(num[i][j]==key)return false;
	
}
int x=n/9/3*3;
int y=n%9/3*3;
for(i=x;i<x+3;i++)
{
	for(int j=y;j<y+3;j++)
	{
		if(num[i][j]==key)return false;
	}
}
return true;
}

int D(int n)
{
	if(n>80)
	{
		sign=true;
		return 0;
	}
	if(num[n/9][n%9]!=0)
	{
		D(n+1);
	}
	else{
	
		for(int i=1;i<=9;i++)
		{
			if(Check(n,i)==true)
			{
				num[n/9][n%9]=i;
				D(n+1);
				if(sign==true)return 0;
				num[n/9][n%9]=0;
			}
		}	
	}
    return n;
} 

C++11(clang++ 3.9) 解法, 执行用时: 7ms, 内存消耗: 376K, 提交时间: 2020-09-16 15:59:19

#include<bits/stdc++.h>
using namespace std;
int a[1001];
bool f=0;
bool check(int x,int num)
{
	int i,y=x%9;
	x/=9;
	for(i=0; i<9; i++)
	{
		if(a[i*9+y]==num&&i!=x)
		{
			return 0;
		}
		if(a[x*9+i]==num&&i!=y)
			return 0;
	}
	int b=x/3*3,c=y/3*3;
	for(i=b;i<b+3;i++)
	{
		for(int j=c;j<c+3;j++)
		{
			if(a[i*9+j]==num&&i!=x&&j!=y)
			return 0;
		}
	}
	return 1;
}
void dfs(int x)
{
	if(x>80)
	{
		f=1;
		return ;
	}
	if(a[x])
	{
		dfs(x+1);
		return ;
	}
	for(int i=1;i<10;i++)
	{
		if(check(x,i))
		{
			a[x]=i;
			dfs(x+1);
			if(f)
			return ;
			a[x]=0;
		}
	}
}
int main()
{
	int i,j;
	for(i=0; i<9; i++)
		for(j=0; j<9; j++)
			cin>>a[i*9+j];
	dfs(0);
	for(i=0;i<9;i++)
	{
		for(j=0;j<9;j++)
		{
			if(j)
			cout<<" ";
			cout<<a[i*9+j];
		}
		cout<<endl;
	}
	return 0;
}

上一题