Skip to content

Instantly share code, notes, and snippets.

@tatar1nro
Created May 29, 2012 18:09
Show Gist options
  • Select an option

  • Save tatar1nro/2829812 to your computer and use it in GitHub Desktop.

Select an option

Save tatar1nro/2829812 to your computer and use it in GitHub Desktop.
Волновой гексагональный алогритм
#include "stdafx.h"
#include <iostream>
#include <vector>
//#include "glut.h"
//#pragma comment(lib, "glut32.lib")
using namespace std;
double h,t=0;
vector <vector <int> > v;
//void renderScene(void);
void keyboard(unsigned char a, int, int);
int angleX = 0;
int angleY = 0;
int angleZ = 0;
class pole
{
public:
int num;
pole();
void init_point(int x, int y);
void end_point(int x, int y);
void barrier(int x, int y);
void print();
void func();
int alg();
};
pole::pole()
{
cout << "Enter number of elements: ";
cin >> num;
v.resize(num);
for(int i=0; i<num; i++)
{
if(i%2==0)
{
v[i].resize(num);
}
else v[i].resize(num-1);
}
}
void pole::func()
{
h=num;
}
void pole::init_point(int x, int y)
{
if(x>=(num-1)||y>=num||x<0||y<0||v[y][x]!=0)
{
cout << "incorrect input!";
}
else
{
v[y][x]=1;
cout << "OK" << endl;
}
}
void pole::end_point(int x, int y)
{
if(x>=(num-1)||y>=num||x<0||y<0||v[y][x]!=0)
{
cout << "incorrect input!";
}
else
{
v[y][x]=-1;
cout << "OK" << endl;
}
}
void pole::barrier(int x, int y)
{
if(x>=(num-1)||y>=num||x<0||y<0||v[y][x]!=0)
{
cout << "incorrect input!";
}
else
{
v[y][x]=-2;
cout << "OK" << endl;
}
}
void pole::print()
{
for(int i=0; i<num; i++)
{
if(i%2==0)
{
for(int j=0; j<num; j++)
{
cout << v[i][j]<< ' ';
}
}
else
{
for(int j=0; j<(num-1); j++)
{
cout << v[i][j]<< ' ';
}
}
cout << endl;
}
cout << endl;
}
int pole::alg()
{
int num1=0, i=1;
bool flg1 = false;
bool flg2 = false;
while(1)
{
flg2=false;
for(int j=0; j<num; j++)
{
if(j%2==0)
{
num1=num;
}
else num1=num-1;
for(int k=0; k<num1; k++)
{
if(v[j][k]==i)
{
//раз
if(j<(num-1)&&k<(num-1))
{
if(v[j+1][k]==0)
{
v[j+1][k]=i+1;
flg2=true;
}
else if(v[j+1][k]==-1)
{
cout << "Way be found for " << i << " steps" << endl;
print();
flg1=true;
flg2=true;
break;
//return 0;
}
}
//два
if(j>0&&k<(num-1))
{
if(v[j-1][k]==0)
{
v[j-1][k]=i+1;
flg2=true;
}
else if(v[j-1][k]==-1)
{
cout << "Way be found for " << i << " steps" << endl;
print();
flg1=true;
flg2=true;
break;
//return 0;
}
}
//три
if(k<(num1-1))
{
if(v[j][k+1]==0)
{
v[j][k+1]=i+1;
flg2=true;
}
else if(v[j][k+1]==-1)
{
cout << "Way be found for " << i << " steps" << endl;
print();
flg1=true;
flg2=true;
break;
//return 0;
}
}
//четыре
if(k>0)
{
if(v[j][k-1]==0)
{
v[j][k-1]=i+1;
flg2=true;
}
else if(v[j][k-1]==-1)
{
cout << "Way be found for " << i << " steps" << endl;
print();
flg1=true;
flg2=true;
break;
//return 0;
}
}
if(j%2==0)
{
//пять
if(k>0&&j>0&&k<(num-1))
{
if(v[j-1][k-1]==0)
{
v[j-1][k-1]=i+1;
flg2=true;
}
else if(v[j-1][k-1]==-1)
{
cout << "Way be found for " << i << " steps" << endl;
print();
flg1=true;
flg2=true;
break;
//return 0;
}
}
//шесть
if(k>0&&j<(num-1)&&k<(num-1))
{
if(v[j+1][k-1]==0)
{
v[j+1][k-1]=i+1;
flg2=true;
}
else if(v[j+1][k-1]==-1)
{
cout << "Way be found for " << i << " steps" << endl;
print();
flg1=true;
flg2=true;
break;
//return 0;
}
}
}
else
{
//пять
if(k<(num1-1)&&j>0)
{
if(v[j-1][k+1]==0)
{
v[j-1][k+1]=i+1;
flg2=true;
}
else if(v[j-1][k+1]==-1)
{
cout << "Way be found for " << i << " steps" << endl;
print();
flg1=true;
flg2=true;
break;
//return 0;
}
}
//шесть
if(k<(num1-1)&&j<(num-1))
{
if(v[j+1][k+1]==0)
{
v[j+1][k+1]=i+1;
flg2=true;
}
else if(v[j+1][k+1]==-1)
{
cout << "Way be found for " << i << " steps" << endl;
print();
flg1=true;
flg2=true;
break;
//return 0;
}
}
}
}
}
if(flg1==true)
{
break;
}
}
if(flg1==true)
{
break;
}
if(flg2==false)
{
cout << "Way not found!";
break;
}
//print();
i++;
}
i++;
bool flag1=false;
if(flg2 == true)
{
while(i!=1)
{
flag1=false;
for(int j=0; j<num; j++)
{
if(j%2==0)
{
num1=num;
}
else num1=num-1;
for(int k=0; k<num1; k++)
{
if(v[j][k]==i)
{
if(flag1==false)
{
if(j<(num-1)&&k<(num-1))
{
if(v[j+1][k]==i+1||v[j+1][k]==-1)
{
flag1=true;
//flag2=true;
continue;
}
}
//два
if(j>0&&k<(num-1))
{
if(v[j-1][k]==i+1||v[j-1][k]==-1)
{
flag1=true;
//flag2=true;
continue;
}
}
//три
if(k<(num1-1))
{
if(v[j][k+1]==i+1||v[j][k+1]==-1)
{
flag1=true;
//flag2=true;
continue;
}
}
//четыре
if(k>0)
{
if(v[j][k-1]==i+1||v[j][k-1]==-1)
{
flag1=true;
//flag2=true;
continue;
}
}
if(j%2==0)
{
//пять
if(k>0&&j>0&&k<(num-1))
{
if(v[j-1][k-1]==i+1||v[j-1][k-1]==-1)
{
flag1=true;
//flag2=true;
continue;
}
}
//шесть
if(k>0&&j<(num-1)&&k<(num-1))
{
if(v[j+1][k-1]==i+1||v[j+1][k-1]==-1)
{
flag1=true;
//flag2=true;
continue;
}
}
}
else
{
//пять
if(k<(num1-1)&&j>0)
{
if(v[j-1][k+1]==i+1||v[j-1][k+1]==-1)
{
flag1=true;
//flag2=true;
continue;
}
}
//шесть
if(k<(num1-1)&&j<(num-1))
{
if(v[j+1][k+1]==i+1||v[j+1][k+1]==-1)
{
flag1=true;
//flag2=true;
continue;
}
}
}
v[j][k]=0;
}
else v[j][k]=0;
}
}
}
i--;
}
}
return 0;
}
/*
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(angleX,1,0,0);
glRotatef(angleY,0,1,0);
glRotatef(angleZ,0,0,1);
glTranslatef(0,0,0);
int n1=0, m=0;
for(int j=0; j<h; j++)
{
if(j%2==0)
{
n1=h;
t=2.0/h;
}
else
{
t=3.0/h;
n1=h-1;
}
for(int i=0; i<n1; i++)
{
if(v[j][i]!=0)
{
m=(v[j][i])%5+1;
glColor3f(0.2*m,0.1*m,0);
if(v[j][i]==1)
{
glColor3f(0,1,0);
}
else if(v[j][i]==-1)
{
glColor3f(0,0,1);
}
else if(v[j][i]==-2)
{
glColor3f(1,0,0);
}
glBegin(GL_POLYGON);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0);
glEnd();
glBegin(GL_POLYGON);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1);
glEnd();
//1
glBegin(GL_QUADS);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0.1);
glEnd();
//2
glBegin(GL_QUADS);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1);
glEnd();
//3
glBegin(GL_QUADS);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1);
glEnd();
//4
glBegin(GL_QUADS);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0.1);
glEnd();
//5
glBegin(GL_QUADS);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1);
glEnd();
//6
glBegin(GL_QUADS);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1);
glEnd();
glBegin(GL_LINES);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0.1);
glEnd();
glColor3f(1,1,1);
glBegin(GL_LINES);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1);
glEnd();
glBegin(GL_LINES);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1);
glEnd();
glBegin(GL_LINES);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0.1);
glEnd();
glBegin(GL_LINES);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1);
glEnd();
glBegin(GL_LINES);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1);
glEnd();
}
glBegin(GL_LINE_LOOP);
glColor3f(1,1,1);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0);
glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0);
glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0);
glEnd();
}
}
glutSwapBuffers();
}
void keyboard(unsigned char a, int, int)
{
switch(a) {
case 'x' :
angleX = angleX + 10;
glutPostRedisplay();
break;
case 'X' :
angleX = angleX - 10;
glutPostRedisplay();
break;
case 'y' :
angleY = angleY + 10;
glutPostRedisplay();
break;
case 'Y' :
angleY = angleY - 10;
glutPostRedisplay();
break;
case 'z' :
angleZ = angleZ + 10;
glutPostRedisplay();
break;
case 'Z' :
angleZ = angleZ - 10;
glutPostRedisplay();
break;
}
}
*/
void main(int argc, char **argv)
{
//glutInit(&argc, argv);
//glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
//glEnable(GL_DEPTH_TEST);
//glutInitWindowPosition(100,100);
//glutInitWindowSize(320,320);
//glutCreateWindow("Wave Algorithm");
//glutDisplayFunc(renderScene);
//glutKeyboardFunc(keyboard);
pole p;
p.func();
int x=0, y=0;
cout << "Enter init X and Y coordinate" << endl;
cout << "X: ";
cin >> x;
cout << "Y: ";
cin >> y;
p.init_point(x,y);
cout << "Enter end X and Y coordinate" << endl;
cout << "X: ";
cin >> x;
cout << "Y: ";
cin >> y;
p.end_point(x,y);
bool flg=true;
while(1)
{
cout <<"Do you want enter barrier?(1|0): ";
cin >> flg;
if(flg==false)
{
cout << "OK" << endl;
break;
}
cout << "Enter barrier X and Y coordinate" << endl;
cout << "X: ";
cin >> x;
cout << "Y: ";
cin >> y;
p.barrier(x,y);
}
int o=p.num-2;
for(int z=0; z<p.num-2; z++)
{
if(z==o||z==o-1)
{
continue;
}
p.barrier(o, z);
p.barrier(o-1, z);
o--;
if(o-16>0&&z-15>0)
{
p.barrier(o-15, z-15);
p.barrier(o-16, z-15);
}
}
p.print();
p.alg();
// glutMainLoop();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment