洛谷 1784 數獨(hdu 1426 Sudoku Killer)
阿新 • • 發佈:2018-12-17
洛谷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;
}