Pers.narod.ru. Алгоритмы. Простейший граф на C++ в графическом режиме консоли

Если предельно упростить определение, то граф - это набор узлов (вершин), связанных между собой линиями (рёбрами, дугами), по которым можно переходить от узла к узлу.

Это учебное упражнение демонстрирует работу с графом как массивом структур на C++.

Одна структура описывает один кружок на экране таким образом:

const int maxlinks=2;
typedef struct krug {
 int cx,cy; //координаты центра
 int r; //радиус
 int links[maxlinks]; //номера связанных кружков, не более maxlinks
};

Вся совокупность кружков графа описана как массив структур:

const int n=4; //количество кружков
krug k[n]={ //описали n кружков
 {100,100,40,{-1,1}}, //-1 - отсутствие связи
 {350,200,50,{1,2}},
 {100,400,45,{-1,-1}},
 {450,430,35,{1,2}}
};

В демке отрисовывается несложный граф из этих кружков и выполняется навигация по нему.

Так как программа использует графический режим, запускать её следует через эмулятор, при этом в папке приложения (по умолчанию c:\BorlandC\Program) должен находиться файл графического драйвера egavga.bgi (скопировать из папки c:\BorlandC\BGI).

Стрелки влево/вправо проходят по кружкам последовательно, стрелки вверх/вниз - через один, если это возможно (в нашем случае связаны кружки 2 и 4). Клавиша Esc - выход из программы. Все связи предполагаются двустронними и достаточно одной записи о связи в массиве k. В этом плане программу несложно изменить. Не забывайте, что нумерация элементов массивов в С++ производится с нуля.

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <graphics.h>

void init () {
int gdriver = VGA, gmode = VGAHI, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
 if (errorcode != grOk) {
  printf("Graphics error: %s\n", grapherrormsg(errorcode));
  printf("Press any key to halt:");
  getch();
  exit(1);
 }
}
const int maxlinks=2;
typedef struct krug {
 int cx,cy; //координаты центра
 int r; //радиус
 int links[maxlinks]; //номера связанных кружков, не более maxlinks
};

void draw (krug *k, int color) { //рисует фишку заданным цветом
 setfillstyle (SOLID_FILL,color);
 fillellipse (k->cx,k->cy,k->r/4,k->r/4);
}

int find (krug *k1, int n1, krug *k2, int n2) { //да, если кружки связаны
 for (int i=0; i<maxlinks; i++)
  if (k1->links[i] == n2 || k2->links[i] == n1) return 1;
 return 0;
}

void main () {
init();
const int n=4; //количество кружков
krug k[n]={ //описали n кружков
 {100,100,40,{-1,1}}, //-1 - отсутствие связи
 {350,200,50,{1,2}},
 {100,400,45,{-1,-1}},
 {450,430,35,{1,2}}
};
bar (0,0,639,479);
setcolor (RED);
for (int i=0; i<n; i++) { //отрисовали контуры кружков и связи
 circle (k[i].cx,k[i].cy,k[i].r);
 for (int j=0; j<2; j++) {
  int l=k[i].links[j];
  if (l!=-1) line (k[i].cx,k[i].cy,k[l].cx,k[l].cy);
 }
}
setfillstyle (SOLID_FILL,GREEN);
char s[10];
for (i=0; i<n; i++) { //залили кружки цветом и вывели номера
 fillellipse (k[i].cx,k[i].cy,k[i].r,k[i].r);
 itoa (i+1,s,10);
 outtextxy (k[i].cx+k[i].r/3,k[i].cy+k[i].r/3,s);
}
i=0;
int ch;
do {
 draw (&k[i],RED);
 ch=getch();
 draw (&k[i],GREEN);
 if (!ch) {
  ch=getch();
  switch (ch) {
   case 75: if (i) i--; break;
   case 77: if (i<n-1) i++; break;
   case 72: if (i>1 && find(&k[i],i,&k[i-2],i-2)) i-=2; break;
   case 80: if (i<n-2 && find(&k[i],i,&k[i+2],i+2)) i+=2; break;
  }
 }
 } while (ch!=27); //до нажатия Esc
closegraph();
}

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz