[P1074]靶形数独

来源:互联网 发布:生物多样性 知乎 编辑:程序博客网 时间:2024/05/17 20:27

原题链接

75分存档待改

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<algorithm>#include<queue>#include<stdio.h>using namespace std;struct hehe{    int xp,yp;}empt[100];int sma[10][10],x[10][10],y[10][10],a[10][10],ans=-1,an,emp;int q[10][10]={    0,0,0,0,0,0,0,0,0,0,    0,6,6,6,6,6,6,6,6,6,    0,6,7,7,7,7,7,7,7,6,    0,6,7,8,8,8,8,8,7,6,    0,6,7,8,9,9,9,8,7,6,    0,6,7,8,9,10,9,8,7,6,    0,6,7,8,9,9,9,8,7,6,    0,6,7,8,8,8,8,8,7,6,    0,6,7,7,7,7,7,7,7,6,    0,6,6,6,6,6,6,6,6,6,        };int h[10][10]={    0,0,0,0,0,0,0,0,0,0,    0,1,1,1,2,2,2,3,3,3,    0,1,1,1,2,2,2,3,3,3,    0,1,1,1,2,2,2,3,3,3,    0,4,4,4,5,5,5,6,6,6,    0,4,4,4,5,5,5,6,6,6,    0,4,4,4,5,5,5,6,6,6,    0,7,7,7,8,8,8,9,9,9,    0,7,7,7,8,8,8,9,9,9,    0,7,7,7,8,8,8,9,9,9,};void dfs(int maki,int tot){       int k;    int nx=empt[tot].xp,ny=empt[tot].yp;    if(tot==emp+1)    {        ans=max(ans,maki);        return;    }    for(k=1;k<=9;k++)        if((x[nx][k]==0)&&(y[ny][k]==0)&&(sma[h[nx][ny]][k]==0))        {            a[nx][ny]=k;            x[nx][k]=1;            y[ny][k]=1;            sma[h[nx][ny]][k]=1;            tot++;            dfs(maki+k*q[nx][ny],tot);            a[nx][ny]=0;            x[nx][k]=0;            y[ny][k]=0;            sma[h[nx][ny]][k]=0;                tot--;                          }           }int main(){    int i,j;    for(i=1;i<=9;i++)        for(j=1;j<=9;j++)        {            scanf("%d",&a[i][j]);            if(a[i][j]!=0)            {                x[i][a[i][j]]=1;                y[j][a[i][j]]=1;                sma[h[i][j]][a[i][j]]=1;                an+=a[i][j]*q[i][j];            }               else             {                emp++;                  empt[emp].xp=i;                empt[emp].yp=j;             }           }    dfs(an,1);    printf("%d",ans);    return 0;}

修改后已AC
AC代码

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<algorithm>#include<queue>#include<stdio.h>using namespace std;int sma[10][10],x[10][10],y[10][10],a[10][10],can[10][10],ans=-1,emp;int q[10][10]={    0,0,0,0,0,0,0,0,0,0,    0,6,6,6,6,6,6,6,6,6,    0,6,7,7,7,7,7,7,7,6,    0,6,7,8,8,8,8,8,7,6,    0,6,7,8,9,9,9,8,7,6,    0,6,7,8,9,10,9,8,7,6,    0,6,7,8,9,9,9,8,7,6,    0,6,7,8,8,8,8,8,7,6,    0,6,7,7,7,7,7,7,7,6,    0,6,6,6,6,6,6,6,6,6,        };int h[10][10]={    0,0,0,0,0,0,0,0,0,0,    0,1,1,1,2,2,2,3,3,3,    0,1,1,1,2,2,2,3,3,3,    0,1,1,1,2,2,2,3,3,3,    0,4,4,4,5,5,5,6,6,6,    0,4,4,4,5,5,5,6,6,6,    0,4,4,4,5,5,5,6,6,6,    0,7,7,7,8,8,8,9,9,9,    0,7,7,7,8,8,8,9,9,9,    0,7,7,7,8,8,8,9,9,9,};void dfs(int tot){       int i,j,k,nx,ny,sum=0,mi=99999999;    if(tot>emp)    {        for(i=1;i<=9;i++)            for(j=1;j<=9;j++)                if(a[i][j]==0) return;                else sum+=a[i][j]*q[i][j];        ans=max(ans,sum);    }    memset(can,0,sizeof(can));    for(i=1;i<=9;i++)        for(j=1;j<=9;j++)            if(!a[i][j])            {                for(k=1;k<=9;k++)                    if((!x[i][k])&&(!y[j][k])&&(!sma[h[i][j]][k])) can[i][j]++;                if(can[i][j]<mi)                {                    mi=can[i][j];                       nx=i;                    ny=j;                }                if(mi==1) break;            }    if(mi==0) return;       if(mi==99999999)    {        int ma=0;        for(i=1;i<=9;i++)            for(j=1;j<=9;j++)                if(a[i][j]==0) return;                else ma+=a[i][j]*q[i][j];        ans=max(ma,ans);        return;    }    for(k=1;k<=9;k++)        if((!x[nx][k])&&(!y[ny][k])&&(!sma[h[nx][ny]][k]))        {            a[nx][ny]=k;            x[nx][k]=1;            y[ny][k]=1;            sma[h[nx][ny]][k]=1;            dfs(tot+1);            a[nx][ny]=0;            x[nx][k]=0;            y[ny][k]=0;            sma[h[nx][ny]][k]=0;                                }           }int main(){    int i,j;    for(i=1;i<=9;i++)        for(j=1;j<=9;j++)        {            scanf("%d",&a[i][j]);            if(a[i][j]!=0)            {                x[i][a[i][j]]=1;                y[j][a[i][j]]=1;                sma[h[i][j]][a[i][j]]=1;            }               else emp++;         }    dfs(1);    printf("%d",ans);    return 0;}
0 0
原创粉丝点击