POJ 2676 Sudoku

题目地址: http://poj.org/problem?id=2676
#include<stdio.h>
#include<string.h>
char map[10][10];
int sum;
int makt[9];
bool makt2[10][10];
void init()
{
      int i ,j;
      sum = 0;
      for( i = 0; i < 9; i++)
      {
            getchar();
            for( j = 0; j < 9; j++)
            {
                     scanf("%c",&map[i][j]);
                     if(map[i][j] != '0')
                     {
                           sum++;
                     }
           }
     }
}
bool CanBe(int col,int row,char e)//判断e在col横,row列是否可以放
{
          int j,m,n;
         for(j = 0; j < 9; j++)
         {
                if(map[col][j] == e)
                {
                     return false;
                }
         }
        for(m = 0; m < 9; m++)
        {
                if(map[m][row] == e )
                {
                      return false;
                }
        }
 
       for(m = 0; m < 3 ; m++)
       {
               for(n = 0; n < 3; n ++)
               {
                        if(map[col/3*3+m][row/3*3+n] == e )
                        {
                                   return false;
                        }
              }
       }
 
      return true;
}
bool dfs(int col)
{
        int i,j,k;
         if(sum == 81)
                return true;
         for( i = col ;i < 9; i++)
         {
                 for(j = 0; j < 9; j++)
                  {
                         if(map[i][j] == '0')
                         {
                                 for(k = 9; k > 0; k--)//倒搜,从9搜到1(从9搜到1的时间为16MS,从1到9搜索的时间为1547MS)
                                 {
                                           if(CanBe(i,j,k+'0'))
                                           {
                                                    sum ++;
                                                    map[i][j] = k + '0';
                                                   if(dfs(i))
                                                  {
                                                         return true;
                                                  }
                                                  map[i][j] = '0';
                                                  sum --;
                                       }
                              }
                          return false;
                     }
               }
         }
         return false;
}
int main()
{
           int T,i;
            scanf("%d",&T);
            while( T-- )
            {
                  init();
                  dfs(0);
                  for( i = 0; i < 9; i++)
                  {
                            printf("%s\n",map[i]);
                   }
            }
       return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值