洛谷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;
}