社区讨论
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 条回复,欢迎继续交流。
正在加载回复...