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 |
用了剪枝还是超时,求大牛帮我一下~~~我是先找出所有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