Re: Вот вам и кyбик...
- From
- Oleg I. Khovayko ()
- To
- Sergey Gridasov
- Date
- 2002-11-05T00:30:32Z
- Area
- RU.ALGORITHMS
From: "Oleg I. Khovayko" <olegh@ncbi.nlm.nih.gov>
Sergey Gridasov wrote:
>
> Good evening, All.
>
> Подскажите, please, алгоpитм задачки...
> ---------------------------------------------------------------------
> | В левом дальнем yглy доски MxN находится кyбик, веpхняя гpань |
> | котоpого намазана клеем. Каждая гpань кyбика имеет такой же pазмеp, |
> | как и клетка доски. Кyбик можно пеpекатывать чеpез pебpо в соседнюю |
> | клеткy. На некотоpых клетках доски также есть клей. Задана таблица |
> | A[1:M,1:N], элемент котоpой pавен 0, если клетка чистая, и 1, если |
> | на ней есть клей. Написать алгоpитм, котоpый опpеделяет можно ли |
> | пеpекатить кyбик из левого дальнего (1,1) в пpавый ближний (M,N) |
> | yгол так, чтобы он нигде не пpиклеился. |
> ---------------------------------------------------------------------
Ты не указал, когда происходит склеивание: когда сталкиваются друг с другом
обе склеиваюшиеся поверхности, или же когда в склеивании учавствует хотя бы
одна клеящая поверхность. Я предположил второе.
Вот моя реализация твоей задачи. Вроде как работает.
Надеюсь, алгоритм сможешь понять из исходника и флейма вокруг твоего запроса.
Там народ правильные слова говорит...
Массивы glued_* - координаты клеток с клеем. Должны заканчиваться на -1.
#include <stdio.h>
#include <stdlib.h>
#define M 100
#define N 200
int glued_Y[] = { 0, 1, -1 };
int glued_X[] = { 1, 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) {
char my_cube[6];
int dir, i;
char mask = 1 << in_cube[5];
if((x|y) < 0 || y >= M || x >= N || (SQ[y][x] & mask) || in_cube[5] == 0)
return;
SQ[y][x] |= mask;
if(SQ[M-1][N-1]) return;
for(dir = 0; dir < 4; dir++) {
for(i = 0; i < 6; i++)
my_cube[Cube_Step[dir][i]] = in_cube[i];
step(y + Y_Step[dir], x + X_Step[dir], my_cube);
}
}
char beg_cube[] = { 0, 1, 2, 3, 4, 5 };
void main() {
int i;
memset(&SQ, 0, M * N);
for(i = 0; glued_X[i] >= 0; i++)
SQ[glued_Y[i]][glued_X[i]] = -1;
step(0, 0, beg_cube);
puts(SQ[M-1][N-1]? "Found way\n" : "No ways\n");
}
--
#include <best/regards.hpp>
Oleg I. KHOVAYKO
(301)435-5885 || WEB: http://olegh.spedia.net
--- ifmail v.2.15dev5
* Origin: National Center for Biotechnology Information (2:5020/400)