已编辑:
#include<iostream>
using namespace std;
#include<conio.h>
#include<string.h>
void dfsvisit(int a[][30], int i, const char *color[])
{
int v;
int p[30];
int f[30]={};
static int j=1;
color[i]="gray";
for(v=1;v<31;v++)
while(a[i][v]!=0)
if(!strcmp(color[a[i][v]],"white"))
{
p[a[i][v]]=i;
dfsvisit(a,i,color);
}
color[i]="black";
j++;
f[i]=1;
cout<<f[i]<<" ";
}
int main()
{
int a[][30]={{2, 16},{4, 8},{5, 16, 21},{1, 2},{1, 9, 27},{1, 10, 15},{4, 6, 11, 12},{4, 16},{2, 19, 29},{3, 14, 28},{3, 13, 15, 17},{8, 9, 18, 26},{1, 7, 10, 19},{5, 8, 20, 24},{3, 21, 29},{1, 2, 8},{16, 23, 28, 29},{4, 12, 21, 24}, {3, 15, 16},{2, 3, 6, 22},{4, 15, 25},{4, 6, 20, 24},{9, 10, 11, 12},{19, 26, 30},{2, 27, 29},{1, 28, 29, 30},{8, 16, 29},{6, 10, 30},{19, 21, 27},{1, 2, 3, 22}};
int i;
const char *color[30];
for(i=1;i<31;i++)
color[i]="white";
for(i=1;i<31;i++)
if(!strcmp(color[i],"white"))
dfsvisit(a,i,color);
return 0;
}
只是想确定我使用const char c
是否正确?如果是的话,我还在哪里做错了?我试图在codeblocks上运行它。它编译得很好,但是当我尝试运行它时,它显示程序已经停止工作。
感谢。
答案 0 :(得分:3)
变化:
for(i=1;i<=30;u++)
为:
for (i = 0; i < 30; i++)
答案 1 :(得分:2)
您正在将指针与常量字符串进行比较,当字符串相等时,这些字符串可能相等也可能不相等。对这种算法使用enum
:
enum { BLACK, GRAY, WHITE };
答案 2 :(得分:2)
你这样说:
for(i=1;i<=30;u++)
编译?
我建议将u
更改为i
...
修改强>
好的,所以你说u
是一个错字。
下一步:在调试器中启动它,等待它循环,进入并逐步完成。
这应该告诉你循环变量发生了什么。
编辑2:
&LT; niggle&gt;
我是第二个建议你使用std :: string的人。您可以考虑删除不规则数组,而不是std::vector
s std::vector
s,通过使用迭代器,它会为您捕获循环中的fencepost error。一般来说,STL vector
比阵列更安全,更舒适,同时又快又小
尽管如此,最好的做法是在for
内而不是在函数范围的开头(RAII)声明循环变量。当然,除非在循环后需要值
&LT; / niggle&gt;
编辑3:
有关std :: string,std :: vector和std :: otherStuff的更多信息:本书Accelerated C++对C ++,特别是STL进行了很好的介绍。在STL-做事方式得到安全覆盖和实践之后,像char*
或数组这样的概念才出现得很晚。我真的很想看到Boost图书馆那样的东西......
答案 3 :(得分:2)
首先,你的for循环不正确,它应该是这样的:
for(i = 0; i < 30; i++)
其次,您的数组int a[][30]
应该类似于int a[30][]
(包含2,3或4个整数的30个元素)。
第三,你不能传递这样的数组,使用指针。
嗯,这段代码不清楚,递归函数可能会导致堆栈溢出。
我希望它会对你有所帮助。
答案 4 :(得分:1)
您希望使用strcmp而不是==进行字符串比较。
然而,目前尚不清楚为什么会这样。你已经删除了可能导致无限循环的代码。
答案 5 :(得分:1)
不,您没有正确使用C样式字符串(char *
)。放弃并使用std::string
代替。
例如:
const char *color[30];
for(i=1;i<31;i++)
color[i]="white";
上面的片段会复制指针,并且不会复制文本。这可能是也可能不是你想要的。
更安全地重写:
const char * color[30]; // 30 pointers to char.
const char text_white[] = "white";
for (i = 0; i < 30; ++i) // Note addition of spaces
{
color[i] = text_white;
}
const char text_white[]
向常量数据声明一个指针text_white
。这将让编译器知道您何时尝试分配文字。
这个的C ++代码:
typedef std::vector<std::string> Text_Container;
Text_Container texts;
const std::string white_text("white");
const unsigned int MAX_TEXTS = 30;
for (i = 0; i < MAX_TEXTS; ++i)
{
texts[i] = white_text; // Makes a copy of the string.
}
放弃char *
文字,除非您的程序需要以节省内存。首选std::string
和std::vector
。