一般的DFS算法:
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、虛擬主機(jī)、營銷軟件、網(wǎng)站建設(shè)、攀枝花網(wǎng)站維護(hù)、網(wǎng)站推廣。
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);
}
}
重復(fù)輸出是因?yàn)?/p>
for(int
i
=
0;
i
n;
i
++)
dfs(0,i);
由于在dfs內(nèi)部,已經(jīng)對當(dāng)前行進(jìn)行過遍歷,在主函數(shù)只需用調(diào)用一次dfs(0,0)即可
而當(dāng)5的時(shí)候,為什么會出錯(cuò),具體原因不清楚
但根據(jù)調(diào)試發(fā)現(xiàn),無法處理對角線間隔多行的情況,特別是第二個(gè)輸出就錯(cuò)了,問題在往上返回的過程中,左下角位置本來是-1,變成了0,這種情況應(yīng)該是在恢復(fù)地圖時(shí)錯(cuò)誤
這個(gè)沒有固定的形式
根據(jù)具體的情況來寫
關(guān)鍵是思想
bfs是先擴(kuò)展節(jié)點(diǎn)再增加深度
dfs是先增加深度,到底后返回再擴(kuò)展節(jié)點(diǎn)
一個(gè)是使用大量空間 另一個(gè)則是遍歷所有路徑,相對的更費(fèi)時(shí)間
你的程序好像是對的。
#include?iostream
using?namespace?std;
int?n,?half;
int?ans;?//?目標(biāo)計(jì)數(shù)
int?count;?//?當(dāng)前+號個(gè)數(shù)
int?p[25][25];?//?當(dāng)前三角形符號,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;
}
首先你的+和- 只有+能得到執(zhí)行,因?yàn)閕f(cur==nres==0)這里的res經(jīng)過res+=next;以后不再是0除非輸入1否則永遠(yuǎn)遞歸下去。
函數(shù)需要返回什么值就返回什么唄,返回int就寫int,沒有返回就寫void。
表示引用,傳引用不需要拷貝構(gòu)造函數(shù)等等復(fù)雜的操作,效率更高。如果
沒有對樹做更改,最好加一個(gè)const修飾符,這樣可以阻止對樹的更改。