一般的DFS算法:
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、虚拟主机、营销软件、网站建设、攀枝花网站维护、网站推广。
typedef struct
{
int all;
int recorder[ALLIN][ALLIN];
}Matrix;
int visited[ALLIN];
void DFS(Matrix data, int i,int num)
{
int *p;
printf("%d",i);
visited[i]=1;
p=data.recorder[i];
for(int j=0;jnum;j++)
{
if(*(p+j)==1 !visited[j])
DFS(data,j,num);
}
}
重复输出是因为
for(int
i
=
0;
i
n;
i
++)
dfs(0,i);
由于在dfs内部,已经对当前行进行过遍历,在主函数只需用调用一次dfs(0,0)即可
而当5的时候,为什么会出错,具体原因不清楚
但根据调试发现,无法处理对角线间隔多行的情况,特别是第二个输出就错了,问题在往上返回的过程中,左下角位置本来是-1,变成了0,这种情况应该是在恢复地图时错误
这个没有固定的形式
根据具体的情况来写
关键是思想
bfs是先扩展节点再增加深度
dfs是先增加深度,到底后返回再扩展节点
一个是使用大量空间 另一个则是遍历所有路径,相对的更费时间
你的程序好像是对的。
#include iostream
using namespace std;
int n, half;
int ans; // 目标计数
int count; // 当前+号个数
int p[25][25]; // 当前三角形符号,1-based,0:+,1:-
void dfs(int t)
{
if (t n)
ans++;
else
{
for (int i = 0; i 2; i++) {
p[1][t] = i;
if (!i)
count++;
for (int j = 2; j = t; j++) {
p[j][t - j + 1] = p[j - 1][t - j + 1] ^ p[j - 1][t - j + 2];
if (!p[j][t - j + 1])
count++;
}
if (count = half t * (t + 1) / 2 - count = half)
dfs(t + 1);
for (int j = 1; j = t; j++)
if (!p[j][t - j + 1])
count--;
}
}
}
int Compute(int i)
{
if (i * (i + 1) / 2 % 2 == 1)
return 0;
n = i;
half = i * (i + 1) / 2 / 2;
ans = 0;
count = 0;
dfs(1);
return ans;
}
int main()
{
for (int i = 1; i = 24; i++) {
cout Compute(i) ", ";
if (i % 4 == 0)
cout endl;
}
return 0;
}
首先你的+和- 只有+能得到执行,因为if(cur==nres==0)这里的res经过res+=next;以后不再是0除非输入1否则永远递归下去。
函数需要返回什么值就返回什么呗,返回int就写int,没有返回就写void。
表示引用,传引用不需要拷贝构造函数等等复杂的操作,效率更高。如果
没有对树做更改,最好加一个const修饰符,这样可以阻止对树的更改。