AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

求问一道蓝桥杯真题(16年的方格填数&dfs)



0


求问一道蓝桥杯真题 16年的方格填数。
如图
(正确答案是1580)
求问哪里出错了?我的代码如下:

include[HTML_REMOVED]

include [HTML_REMOVED]

using namespace std;

int p[4][5];//方格
bool used[10];//记录数值是否被使用过,初始化为都被使用过;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1}; //向四个方向扩展;
int wx[]={-1,1},wy[]={-1,1};//向斜着的方向拓展
int ans;

bool check(int x,int y,int n) //用来判断填入的数字是否连续相邻
{
for(int i=0;i<=3;i++)
{
int xx=x+dx[i], yy=y+dy[i];//十宫格,上下左右四个方向;
if(abs(p[xx][yy]-n)==1) return false;
}
//斜着排

for( int k=0;k<=1;k)
for(int j=0;j<=1;j
)
{
int nx=x+wx[k], ny=y+wy[j];
if(abs(p[nx][ny]-n)==1) return false;
}

return true;
}

void dfs(int x,int y)
{

for(int i=0;i<=9;i)//枚举数字,dfs都是先枚举数字再判断。
{
if(x==3&&y==3) {ans
;return;}

if(!used[i]&&check(x,y,i)) //判断条件:没有被用过且不相邻的数字,跳过
{ p[x][y]=i;
used[i]=true;
if(x>=1&&x<=3&&y>=1&&y<=3) {dfs(x+1,y);used[i]=false;}
if(x==4&&y==1||x==4&&y==2) {dfs(1,y+1);used[i]=false;}
}
}
}

int main()
{
for(int i=0;i<=3;i)
for(int j=0;j<=4;j
)
p[i][j]=-20; //初始化二维数组,全部赋值为取不到的值

dfs(2,1);

printf(“%d”,ans);

return 0;
}



提问于16天前
beabearC…
78


0 个问答


我来回答
你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息