#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QGraphicsScene>
namespace Ui {
class MainWindow;
}
struct Vez;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_horizontalScrollBar_valueChanged(int value);
private:
Ui::MainWindow *ui;
QGraphicsScene * scene;
void nakresli (int relx, Vez & X);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsRectItem>
const int max = 10;
struct Vez
{
int v;
int p [max];
};
Vez A, B, C;
void init (Vez & X)
{
X.v = max;
for (int i = 0; i < max; i++) X.p[i] = max-i;
}
void clear (Vez & X)
{
X.v = 0;
for (int i = 0; i < max; i++) X.p[i] = 0;
}
void krok (Vez & X, Vez & Y)
{
int h = X.p[X.v-1];
X.p[X.v-1] = 0;
X.v --;
Y.v ++;
Y.p[Y.v-1] = h;
}
struct TriVeze { Vez X, Y, Z; };
QList <TriVeze> zaznam;
void uloz ()
{
TriVeze t;
t.X = A;
t.Y = B;
t.Z = C;
zaznam.append(t);
}
void hraj (Vez & X, Vez & Y, Vez & Z, int k)
{
if (k > 1) hraj (X, Z, Y, k-1);
krok (X, Z);
uloz ();
if (k > 1) hraj (Y, X, Z, k-1);
}
void run ()
{
init (A);
clear (B);
clear (C);
uloz ();
hraj (A, B, C, max);
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new QGraphicsScene;
ui->graphicsView->setScene (scene);
run ();
// int w = ui->graphicsView->width();
// int h = ui->graphicsView->height();
// scene->addRect (0, 0, w-1, h-1);
int n = zaznam.count ();
ui->horizontalScrollBar->setMinimum (0);
ui->horizontalScrollBar->setMaximum (n-1);
ui->horizontalScrollBar->setValue (n-1);
setWindowTitle (QString::number (n));
}
void MainWindow::nakresli(int relx, Vez & X)
{
int w = ui->graphicsView->width();
int h = ui->graphicsView->height();
int x = w / 4 * (2+relx);
int ystep = h / max;
int ysize = ystep * 9 / 10;
int xstep = w / ( 8 * max);
for (int i = 0; i < X.v; i++)
{
int n = X.p[i];
int xsize = n * xstep;
int y = (max - i - 1) * ystep;
QGraphicsRectItem * r = new QGraphicsRectItem;
r->setRect (x-xsize, y, 2*xsize, ysize);
QColor c = QColor::fromHsv ((360/max*n)%360, 240, 240);
QColor d = QColor::fromHsv ((360/max*n)%360, 120, 240);
r->setPen (c);
r->setBrush (d);
scene->addItem(r);
}
}
void MainWindow::on_horizontalScrollBar_valueChanged (int value)
{
if (value >= 0 && value < zaznam.count())
{
scene->clear();
TriVeze t = zaznam [value];
nakresli (-1, t.X);
nakresli ( 0, t.Y);
nakresli ( 1, t.Z);
}
}
/*
scene->addLine (10,10, 100,200);
QGraphicsRectItem * r = new QGraphicsRectItem;
r->setRect (20, 20, 120, 240);
r->setBrush (QColor ("yellow"));
r->setPen (QColor ("blue"));
r->setToolTip ("obdelnik");
r->setFlags(QGraphicsItem::ItemIsMovable |
QGraphicsItem::ItemIsSelectable);
scene->addItem (r);
*/
MainWindow::~MainWindow()
{
delete ui;
}