POJ - 2676 Sudoku解题报告(解数独)

    xiaoxiao2021-03-25  74

    题目大意:

    不读了,我猜是数独。这种应用型程序肯定是谁写的越快谁越nb啊,而且对于不同的数据,跑的时间应该会相差很多。好多0ms的不知道是怎么剪枝的。

    从左上角向右下角枚举所有的点的代码(485ms):

    #include<iostream> #include<math.h> #include<string.h> using namespace std; struct point { int x; int y; int a[10]; int n; point() { n=0; } }; int n=0; point p[100]; int map[10][10]={0}; bool flag=0; void ceshi() { for(int i=1;i<n;i++) { cout<<p[i].x<<" "<<p[i].y<<endl; } } void output() { for(int i=1;i<10;i++) { for(int j=1;j<10;j++) { cout<<map[i][j]; } cout<<endl; } } void check(int x) { p[x].n=0; int l[10]={0}; for(int i=1;i<10;i++) { l[map[p[x].x][i]]=1; l[map[i][p[x].y]]=1; } int tx=(p[x].x-1)/3; int ty=(p[x].y-1)/3; tx*=3; ty*=3; for(int i=1;i<=3;i++) { for(int j=1;j<=3;j++) { l[map[tx+i][ty+j]]=1; } } for(int i=1;i<10;i++) { if(l[i]==0) { p[x].a[p[x].n]=i; p[x].n++; } } return; } void dfs(int x)//枚举x号点的所有可能值 { if(x==n+1) { output(); cout<<endl; flag=1; return; } check(x); for(int i=0;i<p[x].n;i++) { map[p[x].x][p[x].y]=p[x].a[i]; //cout<<"x:"<<x<<" i:"<<i<<" "<<p[x].a[i]<<" "<<endl; dfs(x+1); if(flag==1)return; map[p[x].x][p[x].y]=0; } } int main() { int test; cin>>test; while(test--) { flag=0; n=0; for(int i=1;i<10;i++) { for(int j=1;j<10;j++) { char l; cin>>l; map[i][j]=(int)l-'0'; if(map[i][j]!=0)continue; n++; p[n].x=i; p[n].y=j; } } //output(); //ceshi(); dfs(1); memset(map,0,sizeof(map)); } } 改成从右下角向左上角枚举,变成0ms。不会真的要理解出题人意图吧。。。。

    转载请注明原文地址: https://ju.6miu.com/read-32262.html

    最新回复(0)