Другие языки программирования и технологии

Помогите с задачкой, нужна идея.

На скамье длиной L см расположены N гномов. В момент времени 0 гномы начинают двигаться по заданных направлениях со скоростью 1 см в секунду. При столкновении гномы мгновенно разворачиваются и начинают двигаться в противоположных направлениях с той же скоростью. При достижении края скамьи гном падает. Определите через сколько секунд упадёт последний гном.

Входные данные:
1-я строка: N L
N = (1..105), L = (2..106)
2-я строка: N разных чисел - расстояние в сантиметрах от левого края до соответствующего гнома (0..L);
3-я строка: N чисел - направление движения (-1 - влево; 1 - вправо)
Вот, только немного ограничил доску: до 31

#include <iostream>
#include <windows.h>
#include <time.h>
#include <conio.h>
#define H 30 // 105
using namespace std;
int main()
{
char c;
char buff[256];
int j,i,ind,k=0;
srand(time(0));
int L=rand() % H+2;
int N=rand() % L+1;
cout << endl << endl << endl << endl;
CONSOLE_SCREEN_BUFFER_INFO info;
DWORD cbRead = 0;
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(h, &info);
COORD pos = {info.dwCursorPosition.X, info.dwCursorPosition.Y};
ReadConsoleOutputCharacter (h, buff, 256, pos, &cbRead);
pos.Y-=2; pos.X=1;
SetConsoleCursorPosition(h,pos);
for(j=1;j < L+1;j++) cout << '~';
int* z=new int[L+2];
int* g=new int[N];
int* a=new int[N];
for(j=0;j < L+2;z[j++]=-1);
for(j=0;j-N;)
{
int y=rand() % L+1;
if(z[y] < 0) z[a[j]=y]=j,g[j++]=1-(rand()&1)*2;
}
pos.Y-=1,pos.X=L+20; SetConsoleCursorPosition(h,pos),cout << "Sec: " << k;
for(;;)
{
for(pos.X=0;pos.X < L+10;pos.X++) SetConsoleCursorPosition(h,pos),cout << " ";
for(j=0;j-N;j++) if(a[j]>=0) pos.X=a[j],SetConsoleCursorPosition(h,pos),cout << "P";
for(ind=1,j=0;j < L+2;j++) if(z[j]>=0) ind=0;
if(ind) break;
for(j=0;j-N;j++) if(a[j]>=0) if(z[a[j]+g[j]]>=0) g[j]=-2*g[j]; else z[a[j]+g[j]]=j;
for(j=0;j-N;j++) if(a[j]>=0) if(g[j]==1||g[j]==-1) z[a[j]]=-1,a[j]+=g[j],z[a[j]]=j;
for(j=0;j-N;j++) if(g[j]==2||g[j]==-2) g[j]/=2;
Sleep(1000);
for(pos.X=0;pos.X < L+10;pos.X++) SetConsoleCursorPosition(h,pos),cout << " ";
for(j=0;j-N;j++) if(a[j]>=0) pos.X=a[j],SetConsoleCursorPosition(h,pos),cout << "R";
pos.X=L+20; SetConsoleCursorPosition(h,pos),cout << "Sec: " << ++k;
Sleep(500);
if(z[0]>=0||z[L+1]>=0)
{
pos.Y++;
if(z[0]>=0) pos.X=0,SetConsoleCursorPosition(h,pos),cout << "R";
if(z[L+1]>=0) pos.X=L+1,SetConsoleCursorPosition(h,pos),cout << "R";
pos.X=L+5,SetConsoleCursorPosition(h,pos),cout << "A-A-A!";
pos.Y--;
}
for(j=0;j-N;j++) if(a[j]==0||a[j]==L+1) a[j]=-1; z[0]=z[L+1]=-1;
for(pos.X=0;pos.X < L+10;pos.X++) SetConsoleCursorPosition(h,pos),cout << " ";
for(j=0;j-N;j++) if(a[j]>=0) pos.X=a[j],SetConsoleCursorPosition(h,pos),cout << "R";
Sleep(500);
pos.Y++;pos.X=0;
SetConsoleCursorPosition(h,pos);cout << ' ';
for(j=1;j < L+1;j++) cout << '~';
for(j=1;j < 11;j++) cout << ' ';
pos.Y--;
}
delete[] z,g,a;
}
Евгений Кудрявцев
Евгений Кудрявцев
76 473
Лучший ответ
>>нужна идея
ну типа это через цикл делается. В цикле происходит проверка на столкновение гномов (при соударении меняется их состояние) , те что упали - удаляются, далее идёт передвижение оставшихся гномов в соответствии с их состоянием направления (state), если упал последний гном, то выходим из цикла.

p.s.: представил себе этих гномиков.. . жутко-, гомо-, смешное зрелище...