蓝桥杯历届例题,九宫重排

qq_36540476 2017-03-19 01:32:44
看了这个题自己写了代码,但不知道为什么没有返回,希望各位大神给下答案


# include "stdio.h"
# include "math.h"
# include "string.h"

char a[5][5],b[3][3];
int turn[4][2] = {-1,0,0,1,0,-1,1,0};
int kong_x,kong_y,t = 1;
int sum = 0;

void swap(int x,int y) //移动;
{
char t;
t = a[x][y];
a[x][y] = a[kong_x][kong_y];
a[kong_x][kong_y] = t;
kong_x = x;kong_y = y;
}
int chack() //判断是否完成;
{
int i,j,fg = 1;
for(i = 1;i <= 3;i ++)
for(j = 1;j <= 3;j ++)
if(a[i][j] != b[i-1][j-1]) fg = 0;

return fg;
}
void print()
{
int i,j;
for(i = 1;i <= 3;i ++)
{
for(j = 1;j <= 3;j ++)
printf("%c ",a[i][j]);
printf("\n");
}
}
void dfs()
{
int k,fg = 1;
if(fg == chack())
{
if(t>sum)t=sum;
sum = 0;
return;
}
else
for(k = 0;k < 4;k ++)
{
if(a[kong_x+turn[k][0]][kong_y+turn[k][1]] != '0')//判断是否可以交换
{
swap(kong_x+turn[k][0],kong_y+turn[k][1]);
sum ++;
// print();
dfs();
swap(kong_x+turn[k][0],kong_y+turn[k][1]); //回溯;
}

}
}
void find()
{
int i,j;
for(i = 1;i <= 3;i ++)
for(j = 1;j <= 3;j ++)
if(a[i][j] == '.')
{
kong_x = i;
kong_y = j;
printf("%d %d\n",i,j);
return;
}
}
int main(void)
{
int i,j;
char s[3][3];
memset(a,'0',sizeof(a)); //a初始为0;
scanf("%s",s);
scanf("%s",b);
for(i = 0;i < 3;i ++) // 吧起始状态移动到中间
for(j = 0;j < 3;j ++) a[i+1][j+1] = s[i][j];
find();
dfs();
printf("%d\n",t);
return 0;
}
[align=center]
[/align]
...全文
230 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-03-20
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧