📄 cd8_2u.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "cd8_2u.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int graph[8][8]; //图形数组
TShape *sp[8]; //定义sp继承Shape控件
TLabel *lb[8]; //定义lp继承Label控件
int n=0,f=0,t=0,s,ts,temp;
int i,j;
int x[8]={0},y[8]={0}; //辅助边线绘制的x与y的坐标记录
bool vst[8]={false};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ctClick(TObject *Sender) //生成顶点
{
lout->Caption="请在绘图窗口中点鼠标左键";
pnl->Enabled=true; //启动面板功能
}
//---------------------------------------------------------------------------
void __fastcall TForm1::pnlMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y) //画板上的鼠标左键弹起时执行的事件
{
if(ct->Enabled==true) //判断生成顶点按键是否可用
{
if(n<8) //限制顶点数量
{
sp[n]=new TShape(Form1); //执行阶段生成的新对象
sp[n]->Parent=pnl; //设定顶点生成的位置在面板上
sp[n]->Enabled=false;
sp[n]->Left=X-15; //取得顶点中心位置
sp[n]->Top=Y-15;
sp[n]->Height=30; //设定顶点大小
sp[n]->Width=30;
TColor color[8]={clWhite,clYellow,clLime,clBlue,clRed,clAqua,clTeal,clNavy}; //顶点颜色设置
sp[n]->Brush->Color=color[n];
sp[n]->Shape=stEllipse; //顶点形状设置
lb[n]=new TLabel(pnl); //建立新的顶点标签
lb[n]->Parent=pnl; //设置标签属性
lb[n]->Caption=n;
lb[n]->Transparent=true;
lb[n]->Left=X-5;
lb[n]->Top=Y-6;
x[n]=X-8; y[n]=Y-8; //记录顶点位置来绘制边线(注意边线在image控件上)
if(n>0)
{
ln->Enabled=true; //设定连线功能可用
lout->Caption="";
}
}
else //顶点数超过8,就使生成功能不可用
ct->Enabled=false;
n++; //生成结点计数器加1
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::lnClick(TObject *Sender) //连线设置
{
pnl->Cursor=crArrow; //改变鼠标箭头
img->Enabled=true; //相关控件功能属性设置
ct->Enabled=false;
ctb->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::finKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift) //输入起始点
{
if(Key==13)
{
f=StrToInt(fin->Text); //获取用户输入起点信息
if(n>f)
{
img->Canvas->MoveTo(x[f],y[f]); //设定边线起点
fin->Enabled=false; //输入切换
tin->Enabled=true;
Perform(WM_NEXTDLGCTL,0,0);
}
else
ShowMessage("请输入 0 ~ "+IntToStr(n-1)); //注意顶点由0开始
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::tinKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift) //输入终点
{
if(Key==13)
{
t=StrToInt(tin->Text);
if(n>t)
{
img->Canvas->LineTo(x[t],y[t]); //设定并绘制边线终点
tin->Enabled=false; //输入切换
fin->Enabled=true;
tin->Text=""; //清理输入框
fin->Text="";
graph[f][t]=1; //将结点记录存于数组中
graph[t][f]=1;
Perform(WM_NEXTDLGCTL,0,0);
sh->Enabled=true; //启动搜索功能键
}
else
ShowMessage("请输入 0 ~ "+IntToStr(n-1));
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::shClick(TObject *Sender) //执行搜索按键点击事件
{
ln->Enabled=false; //相关控件功能设置
ctb->Visible=false;
psh->Visible=true;
sh->Enabled=false;
}
//---------------------------------------------------------------------------
void dfs(int v) //深度优先搜索函数
{
if(s==v) //找到要搜索的顶点
{
sp[v]->Brush->Color=clMenu; //改变顶点颜色
Form1->Timer1->Enabled=true; //启动搜索到顶点的动画
return;
}
vst[v]=true; //找过的顶点
for(i=0;i<n;i++)
{
if((graph[v][i]==1) && (!vst[i])) //如果顶点没找过
{
temp=v; //保留顶点信息
dfs(i); //由没有找过的顶点出发自找一次
}
}
for(i=0;i<n;i++)
{
if((graph[temp][i]==1) && (!vst[i]))
{
temp=v;
dfs(i);
}
}
}
void __fastcall TForm1::sinKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift) //输入搜索值
{
if(Key==13)
{
s=StrToInt(sin->Text); //获取搜索值
psh->Visible=false;
dfs(0); //调用深度优先搜索法,由定点0开始
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{ //使搜索到的节点闪烁
if(ts==0)
{
sp[s]->Visible=true;
ts=1;
}
else
{
sp[s]->Visible=false;
ts=0;
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -