2018.3.27
自己实力不足
还需加强训练
今天重拾了一下dfs(之前没有学好,好多东西都忘记了)
要注意几点
1、要判重
2、要回溯
3、优化的暴力
#include<bits/stdc++.h>
using namespace std;
int vis[9][9];
int m[9][9];
struct QAQ
{
int x,y;
}Q_Q[81];
int flag=0;
void dfs(int cnt)
{
if(flag)
{
return;
}
if(cnt==-1)
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
printf("%d ",m[i][j]);
}
printf("\n");
}
flag=1;
return;
}
for(int i=1;i<=9&&!flag;i++)
{
int x=Q_Q[cnt].x;
int y=Q_Q[cnt].y;
cout<<x<<' '<<y<<endl;
int t=0;
for(int j=0;j<9&&!t;j++)
{
if(m[x][j]==i)
{
t=1;
}
}
for(int j=0;j<9&&!t;j++)
{
if(m[j][y]==i)
{
t=1;
}
}
int fx=(x/3)*3;
int fy=(y/3)*3;
for(int ix=fx;ix<fx+3&&!t;ix++)
{
for(int jy=fy;jy<fy+3&&!t;jy++)
{
if(m[ix][jy]==i)
{
t=1;
}
}
}
if(!t)
{
vis[x][y]=1;
m[x][y]=i;
dfs(cnt-1);
vis[x][y]=0;
m[x][y]=0;
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
int cnt=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
// char ch[2];
// scanf("%s",ch);
// if(ch[0]=='*')
// {
// m[i][j]=0;
// Q_Q[cnt].x=i;
// Q_Q[cnt].y=j;
// cnt++;
// }
// else
// {
// m[i][j]=ch[0]-'0';
// }
int t;
scanf("%d",&t);
m[i][j]=t;
if(!t)
{
Q_Q[cnt].x=i;
Q_Q[cnt].y=j;
cnt++;
}
}
}
dfs(cnt-1);
return 0;
}