1. 程式人生 > >洛谷 1784 數獨(hdu 1426 Sudoku Killer)

洛谷 1784 數獨(hdu 1426 Sudoku Killer)

洛谷1784 數獨: 首先題意是,給你一個9x9的未填滿的數獨(未填滿用0表示),要求你將這些0的位置上填上數字,以滿足數獨的特性。 解析: 其實這道題爆搜就行,畢竟只是9x9的數獨,直接從每個0的位置開始搜即可 上程式碼:

#include <bits/stdc++.h>
#define ll long long

using namespace std;

typedef pair<int, int> pii;
const int N=9+5;
int x[N*N],y[N*N];
int mp[N][N];
bool ok = 0;
int cnt;

bool check
(int dx,int dy) { for (int i=1; i<=9; i++)if (i!=dx&&mp[i][dy]==mp[dx][dy])return false; for (int i=1; i<=9; i++)if (i!=dy&&mp[dx][i]==mp[dx][dy])return false; int basex=dx; int basey=dy; basex--; basex/=3; basex*=3; basex++; basey--; basey/=3; basey*=3; basey++; for
(int i=0; i<=2; i++) for (int j=0; j<=2; j++) { if (((i+basex)!=dx)&&(j+basey!=dy)) if (mp[i+basex][basey+j]==mp[dx][dy]) return false; } return true; } void dfs(int now) { if (ok) return; if (now == cnt) { for (int i = 1; i <= 9; i++) { for (int j = 1; j <=
9; j++) { printf("%d%c", mp[i][j], j == 9 ? '\n' : ' '); } } ok = 1; return; } for (int i = 1; i <= 9; i++) { mp[x[now]][y[now]] = i; if (check(x[now],y[now]))dfs(now + 1); mp[x[now]][y[now]] = 0; } return; } int main() { for (int i=1; i<=9; i++) { for (int j=1; j<=9; j++) { int now; scanf("%d",&now); if (now!=0) mp[i][j]=now; else { mp[i][j]=0; x[cnt] = i; y[cnt++] = j; } } } dfs(0); return 0; }

hdu1426 這道題其實是與上題是差不多的,只不過是將0換成了問號,還有隨便吐槽一下hdu的辣雞評測系統,PE改的快要瘋了,洛谷最好了

#include <bits/stdc++.h>
#define ll long long

using namespace std;

typedef pair<int, int> pii;
const int N=9+5;
int x[N*N],y[N*N];
int mp[N][N];
bool ok = 0;
int _cnt=0;
int cnt;

bool check(int dx,int dy)
{
	for (int i=1; i<=9; i++)if (i!=dx&&mp[i][dy]==mp[dx][dy])return false;
	for (int i=1; i<=9; i++)if (i!=dy&&mp[dx][i]==mp[dx][dy])return false;
	int basex=dx;
	int basey=dy;
	basex--;
	basex/=3;
	basex*=3;
	basex++;
	basey--;
	basey/=3;
	basey*=3;
	basey++;
	for (int i=0; i<=2; i++)
		for (int j=0; j<=2; j++)
		{
			if (((i+basex)!=dx)&&(j+basey!=dy))
				if (mp[i+basex][basey+j]==mp[dx][dy])
					return false;
		}
	return true;
}

void dfs(int now)
{
	if (ok) return;
	if (now == cnt)
	{
		for (int i = 1; i <= 9; i++)
		{
			for (int j = 1; j <= 9; j++)
			{
				printf("%d%c", mp[i][j], j == 9 ? '\n' : ' ');
			}
		}
		ok = 1;
		return;
	}
	for (int i = 1; i <= 9; i++)
	{
		mp[x[now]][y[now]] = i;
		if (check(x[now],y[now]))dfs(now + 1);
		mp[x[now]][y[now]] = 0;
	}
	return;
}
int main()
{
	char ch;
	while (cin >> ch)
	{
		ok=0;
		cnt = 0;
		if (_cnt)
			printf("\n");
		_cnt++;
		if (isdigit(ch))
			mp[1][1]=ch-'0';
		else
		{
			mp[1][1]=0;
			x[cnt] = 1;
			y[cnt++] = 1;
		}
		for (int i=1; i<=9; i++)
		{
			for (int j=1; j<=9; j++)
			{
				if (i==1&&j==1)continue;

				cin>>ch;
				if (isdigit(ch))
					mp[i][j]=ch-'0';
				else
				{
					mp[i][j]=0;
					x[cnt] = i;
					y[cnt++] = j;
				}
			}
		}
		dfs(0);
	}
	return 0;
}