poj2676_数独

题意:数独问题
这个题思路很好想,但是在判断3*3小区域的时候出现了错误。写的时候还是稳一些吧,要不然调的时候会吐血的。
代码:

View Code
  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <memory.h>
  4 using namespace std;
  5 
  6 const int maxnum=10;
  7 int array[maxnum][maxnum];
  8 bool flag;
  9 int cur;
 10 struct pos
 11 {
 12     int x;
 13     int y;
 14 }pos[82];
 15 
 16 bool judge(int x,int y,int num)
 17 {
 18     int i,j;
 19     for(i=1;i<=9;i++)
 20         if(array[i][y]==num)
 21             return false;
 22     for(i=1;i<=9;i++)
 23         if(array[x][i]==num)
 24             return false;
 25     int a=(x-1)/3*3+1;   //这里出错了,人品啊~
 26     int b=(y-1)/3*3+1;
 27     for(i=a;i<=a+2;i++)
 28         for(j=b;j<=b+2;j++)
 29             if(array[i][j]==num)
 30                 return false;
 31     return true;
 32 }
 33 
 34 void dfs(int curnum)
 35 {
 36     int i;
 37     if(curnum==0)
 38     {
 39         flag=true;
 40         return ;
 41     }
 42     int a=pos[curnum].x;
 43     int b=pos[curnum].y;
 44     //int i;
 45     for(i=1;i<=9;i++)
 46     {
 47         if(judge(a,b,i))
 48         {
 49             array[a][b]=i;
 50             dfs(curnum-1);
 51             if(flag) return ;
 52             array[a][b]=0;
 53         }
 54 
 55     }
 56 }
 57 
 58 int main()
 59 {
 60     int num;
 61     int i,j;
 62     char ch;
 63     scanf("%d",&num);
 64     getchar();
 65     while(num--)
 66     {
 67         cur=1;
 68         flag=false;
 69         memset(array,0,sizeof(array));
 70         for(i=1;i<=9;i++)
 71         {
 72             for(j=1;j<=9;j++)
 73             {
 74                 scanf("%c",&ch);
 75                 if(ch=='0')
 76                 {
 77                     pos[cur].x=i;
 78                     pos[cur].y=j;
 79                     cur++;
 80                 }
 81                 else
 82                     array[i][j]=ch-'0';
 83             }
 84             if(j==10)
 85                 getchar();
 86         }
 87 
 88         dfs(cur-1);
 89         for(i=1;i<=9;i++)
 90         {
 91             for(j=1;j<9;j++)
 92                 printf("%d",array[i][j]);
 93             if(j==9)
 94                 printf("%d\n",array[i][j]);
 95         }
 96     }
 97     return 0;
 98 }
 99 
100 /*
101 1
102 100628579
103 572139468
104 986754231
105 391542786
106 468917352
107 725863914
108 237481695
109 619275843
110 854396127
111 */

 

tju oj 1851

转载于:https://www.cnblogs.com/pushing-my-way/archive/2012/07/29/2613782.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值