Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:用了剪枝还是超时,求大牛帮我一下~~~In Reply To:用了剪枝还是超时,求大牛帮我一下~~~ Posted by:dudouzhu at 2011-07-20 16:24:29 > 我是先找出所有0点,然后计算每个0点的能取状态数,最后按状态数排序,从状态数最小的0点开始深搜,不知道为什么一直超时 > #include <iostream> > #include <stdio.h> > #include <algorithm> > using namespace std; > int b[9][9]; > int nx[100],ny[100],top,n[100],r[100];//top表示有多少个0,n表示每个0点可放数的数目,nx表示每个0点的横坐标,ny表示纵坐标,r用来对所有0点的状态数排序 > int cmp(const int i,const int j) > { > return n[i]<n[j]; > } > int judge(int x,int y,int num) > { > int i,j; > for(i=0;i<9;i++) > if(b[i][y]==num) return 0; > for(i=0;i<9;i++) > if(b[x][i]==num) return 0; > for(i=x/3*3;i<=x/3*3+2;i++) > for(j=y/3*3;j<=y/3*3+2;j++) > if(b[i][j]==num) return 0; > return 1; > } > int count(int x,int y) > { > int num=0,temp=1; > while(temp<10) > { > if(judge(x,y,temp)) num++; > temp++; > } > return num; > } > int dfs(int k) > { > if(k==top) return 1; > int e=r[k]; > int i; > for(i=1;i<=9;i++) > { > if(!judge(nx[e],ny[e],i)) continue; > int x=nx[e],y=ny[e]; > b[x][y]=i; > if(dfs(k+1)) return 1; > b[x][y]=0; > } > return 0; > } > int main() > { > int i,j,t; > char s[11]; > scanf("%d",&t); > while(t--) > { > top=0; > for(i=0;i<9;i++) > { > scanf("%s",s); > for(j=0;j<9;j++) > { > b[i][j]=s[j]-'0'; > if(b[i][j]==0) > { > nx[top]=i; > ny[top]=j; > n[top]=count(nx[top],ny[top]); > r[top]=top; > top++; > } > } > } > sort(r,r+top,cmp); > dfs(0); > for(i=0;i<9;i++) > { > for(j=0;j<9;j++) > printf("%d",b[i][j]); > printf("\n"); > } > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator