头像

beabearChocolate




离线:21小时前


最近来访(5)
用户头像
redkaoliang
用户头像
源泉
用户头像
飞鱼の舞
用户头像
1584185824
用户头像
ByulE


求问一道蓝桥杯真题 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;
}