蒟蒻求助,始终输出0,好像是dfs执行不到终点,但不知道为什么,求调
查看原帖
蒟蒻求助,始终输出0,好像是dfs执行不到终点,但不知道为什么,求调
614725
masonpop楼主2022/12/28 22:20

rt.这里是代码。

#include <bits/stdc++.h>
using namespace std;
const int maxn=15;
int a[maxn][maxn],tot,ans,now,line[maxn][maxn],col[maxn][maxn],block[maxn][maxn];
struct node{
	int x,y,num,bel;//坐标,分值,属于的宫 
}p[maxn];
struct options{
	int idx,cnt;//行下标, 待填的数量 
	bool operator<(const options &o)const{
		return cnt<o.cnt;
	}
}opt[maxn];
inline int belong(int x,int y)//属于的宫
{
	if(x<=3)
	{
		if(y<=3)return 1;
		if(y<=6)return 2;
		if(y<=9)return 3;
	}
	if(x<=6)
	{
		if(y<=3)return 4;
		if(y<=6)return 5;
		if(y<=9)return 6;
	}
	if(x<=9)
	{
		if(y<=3)return 7;
		if(y<=6)return 8;
		if(y<=9)return 9;
	}
} 
inline int score(int x,int y)
{
	if(x==1 || x==9 || y==1 || y==9)return 6;
	if(x==2 || x==8 || y==2 || y==8)return 7;
	if(x==3 || x==7 || y==3 || y==7)return 8;
	if(x==4 || x==6 || y==4 || y==6)return 9;
	return 10;
}
inline void dfs(int n,int sum)
{
	if(n==tot+1)//合法填完了所有的数 
    {
        ans=max(ans,sum);
        return;
    }
    for(int i=1;i<=9;i++) 
    {
        if(!line[p[n].x][i] && !col[p[n].y][i] && !block[p[n].bel][i])//判断可不可以将i填入 
        {
            line[p[n].x][i]=col[p[n].y][i]=block[p[n].bel][i]=1;
            dfs(n+1,sum+(p[n].num*i));
            line[p[n].x][i]=col[p[n].y][i]=block[p[n].bel][i]=0;
        }
    }
    return;
}
int main()
{
	for(int i=1;i<=9;i++)opt[i].idx=i;
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=9;j++)
		{
			scanf("%d",&a[i][j]);
			if(a[i][j]>0)
			{
				now+=(a[i][j]*score(i,j));//已填
				line[i][a[i][j]]=col[j][a[i][j]]=block[belong(i,j)][a[i][j]]=1;//标记
			}
			else opt[i].cnt++;
		}
	}
	sort(opt+1,opt+9+1);
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=9;j++)
		{
			if(a[opt[i].idx][j]==0)
			{
				p[tot++].x=opt[i].idx;
				p[tot].y=j;
				p[tot].bel=belong(opt[i].idx,j);
				p[tot].num=score(opt[i].idx,j);
			}
		}
	}
	dfs(1,now);
	printf("%d\n",ans);
	return 0;
} 
2022/12/28 22:20
加载中...