Cube-3

From
Oleg Khovayko ()
To
Oleg Khovayko
Date
2002-11-05T14:29:26Z
Area
RU.ALGORITHMS
From: Oleg Khovayko <olegh@hotpop.com>

Написал я предыдущую версию про кубик, все вроде как
работает, опубликовал - а потом подумал: Понятно, что
где-то к доске кубик не имеет права приклеиваться, ибо дальше не
сможет катиться. А касается ли это ограничение последней
точки (точки назначения)?!?!?!??
Я так поразмыслил, что нет - ибо надо, чтобы кубик просто
здесь оказался. А уж в приклееном состоянии или нет - неважно.
Поэтому пришлось модифицировать алгоритм, чтобы он точку
назначения корректно обрабатывал - то есть чтобы можно было ее
тоже клеем смазывать и/или кубик мог на нее падать клейкой
стороной. Ниже - третья модификация, которая корректно обслуживает
точку назначения:




#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

#define M 100
#define N 200

int glued_Y[] = { 0, 2, 1, M-1, -1 };
int glued_X[] = { 1, 1, 2, N-1, -1 };

/*----------------------------------------------------*/

char SQ[M][N];

char Cube_Step[4][6] = {
   { 2, 1, 5, 3, 0, 4 },
   { 3, 0, 2, 5, 4, 1 },
   { 4, 1, 0, 3, 5, 2 },
   { 1, 5, 2, 0, 4, 3 }
};

char X_Step[] = {  0, 1, 0, -1 };
char Y_Step[] = {  1, 0, -1, 0 };

/*----------------------------------------------------*/

void step(int y, int x, const char in_cube) {
   int dir;
   char mask = 1 << in_cube, sq;

   if((x|y) < 0 || y >= M || x >= N)
     return;

   sq = SQ[y][x]; SQ[y][x] |= mask | 0200;

   if(SQ[M-1][N-1] >= 0 && in_cube != 5 && (sq & mask) == 0)
     for(dir = 0; dir < 4; dir++)
       step(y + Y_Step[dir], x + X_Step[dir], Cube_Step[dir][in_cube]);
} /* step */

/*----------------------------------------------------*/

void main() {
	int i;
     memset(&SQ, 0, M * N);

     for(i = 0; glued_X[i] >= 0; i++)
       SQ[glued_Y[i]][glued_X[i]] = 0177;

     step(0, 0, 0);

     puts(SQ[M-1][N-1] < 0? "Found way\n" : "No ways\n");
}

--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)