hdu Sudoku Killer

简单的dfs,主要就是每个?处填的值是否满足条件的判断。这道题感觉考察的是输出格式的控制。

#include"iostream"
#include"stdio.h"
#include"algorithm"
#include"cmath"
#include"string.h"
#include"string"
#define mx 1005
using namespace std;
int shudu[100][100];
int num,icase;
bool flag;
struct node
{
    int x,y;
}position[mx];

bool check(int num,int cur)
{
    int i,j;
    for(i=0;i<9;i++)
    {
        if(i==position[cur].x) continue;
        if(num==shudu[i][position[cur].y]) return false;
    }
    for(j=0;j<9;j++)
    {
        if(j==position[cur].y) continue;
        if(num==shudu[position[cur].x][j]) return false;
    }
    int xx=position[cur].x,yy=position[cur].y;
    xx=(xx/3)*3;yy=(yy/3)*3;
    for(i=xx;i<xx+3;i++)
    {
        for(j=yy;j<yy+3;j++)
        {
            if(i==position[cur].x&&j==position[cur].y) continue;
            if(num==shudu[i][j]) return false;
        }
    }
    return true;
}
void dis()
{
    if(icase++) cout<<endl;
      for(int i=0;i<9;i++)
        {
            cout<<shudu[i][0];
            for(int j=1;j<9;j++)
                cout<<' '<<shudu[i][j];
            cout<<endl;
        }
}
void dfs(int  step)
{
   if(flag) return;
   if(step==num)
   {
       dis();
       flag=true;
       return;
   }
   for(int i=1;i<=9;i++)
   {
       if(check(i,step))
       {
           shudu[position[step].x][position[step].y]=i;
           dfs(step+1);
           shudu[position[step].x][position[step].y]=0;
       }
   }
}
int main()
{
    int i,j;
    icase=0;
    char s[3];
    while(scanf("%s",s)!=EOF)
    {
        flag=false;
        num=0;
        if(s[0]=='?')
        {
            position[num].x=0;position[num++].y=0;shudu[0][0]=0;
        }
        else shudu[0][0]=s[0]-'0';
        for(i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            {
                if(i==0&&j==0) continue;
                scanf("%s",s);
                if(s[0]=='?')
                {
                     position[num].x=i;position[num++].y=j;shudu[i][j]=0;
                }
                else
                {
                    shudu[i][j]=s[0]-'0';
                }
            }
        }
        dfs(0);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/acm-jing/p/4442001.html