Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:那位好心人帮我看看代码,哪有问题啊

Posted by hehexiaobai at 2010-08-18 21:23:55
In Reply To:那位好心人帮我看看代码 Posted by:hehexiaobai at 2010-08-18 21:23:40
#include<iostream>
#include<string.h>
using namespace std;
int sudo[10][10];

struct type
{
       int x,y,count; 
}status[82];  
int num_status=0;

bool check(int i, int j, int t)//judge if it is possible to put digit t at (i,j)
{
     for(int k=1; k<=9; k++)
             if(sudo[i][k]==t&&j!=k)return false;
     for(int k=1; k<=9; k++)
             if(sudo[k][j]==t&&k!=i)return false;
     int x=(i-1)/3*3+1 ,y=(j-1)/3*3+1;
     for(int s=0; s<=2; s++)
     for(int tt=0; tt<=2; tt++)
             if(sudo[x+s][y+tt]==t&&!(i==x+s&&j==y+tt))return false;
     return true;             
}

int cal(int i, int j)//calculate the the number of  possible status of (i,j) 
{
    int cnt=0;
    for(int p=1; p<=9; p++)
            if(check(i,j,p))cnt++;
            
    return cnt;
}


bool cmp(const type &a, const type &b)
{
     return a.count<b.count;
}

void dfs(int cnt,bool &find)
{
     if(find){ return ;}
     int x=status[cnt].x; 
     int y=status[cnt].y;
     if(cnt==num_status)
     {
              for(int p=1; p<=9; p++)
                      if(check(x,y,p))
                      {
                                      sudo[x][y]=p;
                                      for(int i=1; i<=9; i++,cout<<endl)
                                      for(int j=1; j<=9; j++)
                                              cout<<sudo[i][j];
                                      find=true;
                                      return ;
                      }
                      return ;    
     }
     for(int p=1; p<=9; p++)
     {
             if(check(x,y,p))
             {
              sudo[x][y]=p;
              dfs(cnt+1,find);
             }
     }
         
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
       memset(sudo,0,sizeof sudo); 
       char ch;
       num_status=0;
       for(int i=1; i<=9; i++)
               for(int j=1; j<=9; j++)
               { 
                cin>>ch;
                sudo[i][j]=int(ch-'0');
                }
                
       for(int i=1; i<=9; i++)
       for(int j=1; j<=9; j++)
                  if(sudo[i][j]==0)
                  {
                      num_status++; 
                      status[num_status].x=i; status[num_status].y=j; 
                      status[num_status].count=cal(i,j); 
                  }
       
       sort(status+1,status+1+num_status,cmp);
       
       //for(int i=1; i<=num_status ;i++)
         //      cout<<' '<<status[i].x<<' '<<status[i].y<<' '<<status[i].count<<endl;

       
       bool find=false;
       dfs(1,find);
       
    }
    system("pause");
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator