Напишите программу, ищущую выход из
carry(n, from, to, by) = if( n > 0 ){ carry( n-1, from, by, to ); перенесиОдинДиск( from, to ); carry( n-1, by, to, from ); } Вызов: carry( n, 0, 1, 2 ); n - сколько дисков перенести (n > 0). from - откуда (номер стержня). to - куда. by - при помощи (промежуточный стержень).
n дисков потребуют (2**n)-1 переносов.
Напишите программу, ищущую выход из лабиринта ("червяк в лабиринте"). Лабиринт загружается из файла .maze (не забудьте про расширение табуляций!). Алгоритм имеет рекурсивную природу и выглядит примерно так:
#include <setjmp.h>
jmp_buf jmp; int found = 0; maze(){ /* Это головная функция */ if( setjmp(jmp) == 0 ){ /* начало */ if( неСтенка(x_входа, y_входа)) GO( x_входа, y_входа); } } GO(x, y){ /* пойти в точку (x, y) */ if( этоВыход(x, y)){ found = 1; /* нашел выход */ пометить(x, y); longjmp(jmp, 1);} пометить(x, y); if( неСтенка(x-1,y)) GO(x-1, y); /* влево */ if( неСтенка(x,y-1)) GO(x, y-1); /* вверх */ if( неСтенка(x+1,y)) GO(x+1, y); /* вправо */ if( неСтенка(x,y+1)) GO(x, y+1); /* вниз */ снятьПометку(x, y); } #define пометить(x, y) лабиринт[y][x] = '*' #define снятьПометку(x, y) лабиринт[y][x] = ' ' #define этоВыход(x, y) (x == x_выхода && y == y_выхода) /* можно искать "золото": (лабиринт[y][x] == '$') */ неСтенка(x, y){ /* стенку изображайте символом @ или # */ if( координатыВнеПоля(x, y)) return 0; /*край лабиринта*/ return (лабиринт[y][x] == ' '); }
Отобразите массив лабиринт на видеопамять (или воспользуйтесь curses-ом). Вы увидите червяка, ползающего по лабиринту в своих исканиях.
Используя библиотеку termcap напишите функции для:
- очистки экрана.
- позиционирования курсора.
- включения/выключения режима выделения текста инверсией.
© Copyright А. Богатырев, 1992-95
Си в UNIX
| |
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий