社区讨论

tle #11

P1074[NOIP 2009 提高组] 靶形数独参与者 5已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mi7w6w03
此快照首次捕获于
2025/11/21 04:37
4 个月前
此快照最后确认于
2025/11/21 04:37
4 个月前
查看原帖
求助
CPP
# include <cstdio>
using namespace std;
int a[10][10];
const int jiugong[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}};
const int score[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}};
bool flag;
int num=0,ans=0;
bool hang[10][10],lie[10][10],gong[10][10];
void dfs(int x,int y)
{
    if (x==0)
    {
        flag=true;
        for (int i = 1; i <= 9; ++i)
            for (int j = 1; j <= 9; ++j)
                num+=a[i][j]*score[i][j];
        if (num>ans)
            ans=num;
        num=0;
    }
    if (a[x][y]!=0)
    {
        if (y==9)
            dfs(x-1,1); 
        if (y!=9)
            dfs(x,y+1);
    }
    if (a[x][y]==0)
        for (int i = 1; i <= 9; i++) 
            if (!hang[x][i] && !lie[y][i] && !gong[jiugong[x][y]][i])
            {
                a[x][y]=i;
                hang[x][i]=true;
                lie[y][i]=true;
                gong[jiugong[x][y]][i]=true;
                if (y==9)
                    dfs(x-1,1);
                if (y<9)
                    dfs(x,y+1);
                a[x][y]=0;
                hang[x][i]=false;
                lie[y][i]=false;
                gong[jiugong[x][y]][i]=false;
            }
}
int main()
{
    for (int i = 1; i <= 9; i++)
        for (int j = 1; j <= 9; j++)
        {
            scanf("%d",&a[i][j]);
            if (a[i][j]!=0)
            {
                hang[i][a[i][j]]=1;
                lie[j][a[i][j]]=1;
                gong[jiugong[i][j]][a[i][j]]=1;
            }
        }
    dfs(9,1);
    if (flag==false)
    {
        printf("-1\n");
        return 0;
    }
    printf("%d",ans);
    return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...