求调数独
  • 板块学术版
  • 楼主YuYuanPQ
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/11 20:59
  • 上次更新2024/4/11 22:40:30
查看原帖
求调数独
1029900
YuYuanPQ楼主2024/4/11 20:59

以下是题面(POJ3074数独):

题目描述

给出若干组数独的数据,求完整的数独方案。

输入格式

多组数据,每组数据在一行上输入81个字符,可以是数字1-9,未填数字的格子用句点'.';表示。第1-9个数字表示第1行,接下来9个数字表示第2行,其余的以此类推。

最后一组数据后,用单词end表示结束。

输出格式

每组数据输出一行,是一个完整的数独方案。数据保证答案唯一。

样例输入

.2738..1..1...6735.......293.5692.8...........6.1745.364.......9518...7..8..6534.
......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3.
end

样例输出

527389416819426735436751829375692184194538267268174593643217958951843672782965341
416837529982465371735129468571298643293746185864351297647913852359682714128574936

原题在 here

My code

#include<bits/stdc++.h>
#define MAXN 150
#define MAXST 100
using namespace std;
int n=9,a[MAXN][MAXN];
char st[MAXST];
bool h[MAXN][MAXN];
bool l[MAXN][MAXN];
bool jgg[MAXN][MAXN];
int lw;
bool yuan[MAXN][MAXN];
struct node{
	int x,y;
}w[MAXN*MAXN];
int zh(int x,int y)
{
	if(x>=1&&x<=3)
	{
		if(y>=1&&y<=3)
		{
			return 1;
		}
		else if(y>=4&&y<=6)
		{
			return 2;
		}
		else
		{
			return 3;	
		}
	}
	else if(x>=4&&x<=6)
	{
		if(y>=1&&y<=3)
		{
			return 4;
		}
		else if(y>=4&&y<=6)
		{
			return 5;
		}
		else
		{
			return 6;
		}
	}
	else
	{
		if(y>=1&&y<=3)
		{
			return 7;
		}
		else if(y>=4&&y<=6)
		{
			return 8;
		}
		else
		{
			return 9;
		}
	}
}
void dfs(int x,int y,int k)
{
	for(int q=1;q<=9;q++)
	{
		if(!h[x][q]&&!l[y][q]&&!jgg[zh(x,y)][q])
		{
			h[x][q]=1;
			l[y][q]=1;
			jgg[zh(x,y)][q]=1;
			a[x][y]=q;
			k++;
			if(k<=lw) dfs(w[k].x,w[k].y,k);
			k--;
			h[x][q]=0;
			l[y][q]=0;
			jgg[zh(x,y)][q]=0;
		}
	}
}
void solve()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(a[i][j]==-2) w[++lw].x=i,w[lw].y=j;
			else
			{
				h[i][a[i][j]]=1;
				l[j][a[i][j]]=1;
				jgg[zh(i,j)][a[i][j]]=1;
			}
		}
	}
	dfs(w[1].x,w[1].y,1);
	return;
}
void print()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			printf("%d ",a[i][j]);
		}
		putchar('\n');
	}
	return;
}
void reset()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			h[i][j]=l[i][j]=jgg[i][j]=0;
		}
	}
	lw=0;
	return;
}
int main()
{
	scanf("%s",st);
	while(1)
	{
		if(st[0]=='e') break;
		int x=1,y=0;
		for(int i=0;i<strlen(st);i++)
		{
			y++;
			if(y>9)
			{
				y=1;
				x++;
			}
			a[x][y]=st[i]-48;
		}
		solve();
		print();
		reset();
		scanf("%s",st);
	}
	return 0;
}
2024/4/11 20:59
加载中...