//---------------------------------------------------------------------------
#include
#include
#include <math.h><br />#include
#include
#include
#include "Unit1.h"
#define TRUE 1
#define FALSE 0
#define pixel_count 22500 //image_size ^ 2
#define image_size 150
using namespace std;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
struct Position
{
int x;
int y;
struct Position *neighbor;
int neighbor_count;
};
Position position[pixel_count];
//DFS
struct Node_Mode1
{
int vertex;
Node_Mode1 *link;
};
//---------------------------------------------------------------------------
class TCon_Com_Mode1
{
public:
int count;
int visited[pixel_count];
AnsiString path;
Node_Mode1 *adjlist[pixel_count];
void LoadFromFile();
void show();
void dfs(int);
Node_Mode1 *searchlast(Node_Mode1 *);
};
//---------------------------------------------------------------------------
void TCon_Com_Mode1::LoadFromFile()
{
int tag=0;
for(int x=0;x {
for(int y=0;y {
position[tag].x=x;
position[tag].y=y;
tag ;
}
}
Node_Mode1 *nodes,*lastnode;
count=pixel_count;
for (int Vi=0;Vi {
visited[Vi]=false;
adjlist[Vi]=new Node_Mode1;
adjlist[Vi]->vertex=Vi;
adjlist[Vi]->link=NULL;
}
for (int Vi=0;Vi {
double Vj;
if(Vi==0)
{
for(int k=0;k<2;k )
switch(k)
{
case 0:
Vj=1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(Vi==(image_size-1))
{ for(int k=0;k<2;k )
switch(k)
{
case 0:
Vj=2*image_size-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=image_size-2;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(Vi==pixel_count-image_size) //639200
{ for(int k=0;k<2;k )
switch(k)
{
case 0:
Vj=pixel_count-2*image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=pixel_count-image_size 1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(Vi==pixel_count-1)
{ for(int k=0;k<2;k )
switch(k)
{
case 0:
Vj=pixel_count-image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=pixel_count-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(Vi>0 && Vi { for(int k=0;k<3;k )
switch(k)
{
case 0:
Vj=(position[Vi].x*image_size position[Vi].y) 1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=(position[Vi].x*image_size position[Vi].y) image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 2:
Vj=(position[Vi].x*image_size position[Vi].y)-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(Vi>(pixel_count-image_size) && Vi { for(int k=0;k<3;k )
switch(k)
{
case 0:
Vj=(position[Vi].x*image_size position[Vi].y)-image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=(position[Vi].x*image_size position[Vi].y) 1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 2:
Vj=(position[Vi].x*image_size position[Vi].y)-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if( (Vi%image_size==0) && Vi!=0 && Vi!=(pixel_count-image_size))
{ for(int k=0;k<3;k )
switch(k)
{
case 0:
Vj=(position[Vi].x*image_size position[Vi].y)-image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=(position[Vi].x*image_size position[Vi].y) 1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 2:
Vj=(position[Vi].x*image_size position[Vi].y) image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if(( (Vi 1)%image_size==0) && Vi!=(image_size-1) && Vi!=(pixel_count-1))
{ for(int k=0;k<3;k )
switch(k)
{
case 0:
Vj=(position[Vi].x*image_size position[Vi].y)-image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=(position[Vi].x*image_size position[Vi].y) image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 2:
Vj=(position[Vi].x*image_size position[Vi].y)-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
else if( (Vi%image_size!=0) && ((Vi 1)%image_size!=0))
{ for(int k=0;k<4;k )
switch(k)
{
case 0:
Vj=(position[Vi].x*image_size position[Vi].y)-image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 1:
Vj=(position[Vi].x*image_size position[Vi].y) 1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 2:
Vj=(position[Vi].x*image_size position[Vi].y) image_size;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
case 3:
Vj=(position[Vi].x*image_size position[Vi].y)-1;
nodes=new Node_Mode1;
nodes->vertex=Vj;
nodes->link=NULL;
lastnode=searchlast(adjlist[Vi]);
lastnode->link=nodes;
break;
}
}
}
}
//---------------------------------------------------------------------------
Node_Mode1 *TCon_Com_Mode1::searchlast(Node_Mode1 *linklist)
{
Node_Mode1 *ptr;
ptr=linklist;
while (ptr->link!=NULL) ptr=ptr->link;
return ptr;
}
//---------------------------------------------------------------------------
void TCon_Com_Mode1::dfs(int v)
{
Node_Mode1 *ptr;
int w;
visited[v]=true;
int xi,yi;
xi=v/image_size;
yi=v%image_size;
Form1->Image1->Canvas->Pixels[xi][yi]=clBlue;
ptr=adjlist[v]->link;
while(ptr!=NULL)
{
w=ptr->vertex;
if (!visited[w])
dfs(w);
else
ptr=ptr->link;
};
}
//---------------------------------------------------------------------------
void TCon_Com_Mode1::show()
{
path="";
for (int v=0;v {
if (!visited[v])
{
dfs(v);
}
}
}
TCon_Com_Mode1 Con_Com;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Con_Com.LoadFromFile();
Con_Com.show();
}
//---------------------------------------------------------------------------
以上是完整的程式碼。我的程式是在一個NxN的Image中執行Deep First Search,從(0,0)也就是左上角的點開始,
依照順時針方向(上->右->下->左)作search。
當我的image_size=150的時候程式還可以執行,但是設定到200,pixel_count=40000的時候,執行到一半就會出現stack overflow的錯誤,而我這個程式是要執行到800*800的圖片,請問該怎麼解決?謝謝