请大神详细描述下dfs ,真的不是很懂,为什么这个题目里边调用dfs后vis[i]要置为0呢

zyckhuntoria 2016-03-19 11:07:43

第7题:六角填数(12')


如图所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?

请通过浏览器提交答案,不要填写多余的内容。


#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;

#define eps 10e-10
#define N 15

int a[N];
bool vis[N];

void dfs(int x){
if(x == 1 || x == 2 || x == 12){
dfs(x+1);
return ;
}
if(x > 12){
int t[6];
t[0] = a[1] + a[3] + a[6] + a[8];
t[1] = a[1] + a[4] + a[7] + a[11];
t[2] = a[2] + a[3] + a[4] + a[5];
t[3] = a[2] + a[6] + a[9] + a[12];
t[4] = a[8] + a[9] + a[10] + a[11];
t[5] = a[12] + a[10] + a[7] + a[5];

for(int i = 1; i < 6; ++i){
if(t[i] != t[i-1])return ;
}
cout<<a[6]<<endl;
return ;
}

for(int i = 1;i < 13; ++i){
if(!vis[i]){
vis[i] = 1;
a[x] = i;
dfs(x+1);
vis[i] = 0;
}
}


}

int main(){
memset(vis,0,sizeof(vis));
vis[1] = 1;
a[1] = 1;
vis[8] = 1;
a[2] = 8;
vis[3] = 1;
a[12] =3;

dfs(1);

return 0;
}
...全文
310 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-03-21
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
醉花阴柳 2016-03-19
  • 打赏
  • 举报
回复
vis的下标表示要填的数,值表示是否填了,先尝试把数字填入之后又取回.就像走迷宫,每个路口有两条路,每一条路都尝试走一遍(vis[i]置1),走到头发现不通就回来(vis[i]置0)

69,369

社区成员

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

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