1 / 1 / 0
Регистрация: 22.10.2015
Сообщений: 25
1

Головоломка Хитори

23.11.2015, 17:17. Показов 2522. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выберите на сайте Nikoli любую головоломку, кроме судоку: http://www.nikoli.co.jp/en/puzzles/. Напишите для неё функцию, которая получает первоначальное заполнение поля, а возвращает поле с решенной головоломкой. Функция должна быть написана по возможности в декларативном стиле с использованием рекурсии и других элементов функционального программирования.
 Комментарий модератора 
П.5.19.Правил
Запрещено создавать темы в виде ссылок на задания или коды программ, расположенные на других сайтах.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2015, 17:17
Ответы с готовыми решениями:

Головоломка
//PC1.cpp== Считывает числа с текстового файла и записывает в массив. #include <fstream> #include...

Головоломка
Я ломаю мозг, не знаю что делать помогите. Пытался вспоминать программач, не помогло, кто ответ...

интересная головоломка
помоготе решить задачу про спички я уже неделю голову ломаю....Даны n-спичек и 2 игрока,каждый...

Интересная головоломка
1.С помощью текстового редактора создать файл который содержит текст.Длина ряда с текстом не должна...

5
Модератор
Эксперт С++
13413 / 10523 / 6285
Регистрация: 18.12.2011
Сообщений: 28,103
23.11.2015, 17:24 2
ishkins, Это Вы должны выбрать и ПОЛНОСТЬЮ поместить текст задачи и код, который сумели написать.
0
1 / 1 / 0
Регистрация: 22.10.2015
Сообщений: 25
23.11.2015, 17:31  [ТС] 3
А по ссылке нет ни кода, не задания. Это как бы дополнение.
0
Модератор
Эксперт С++
13413 / 10523 / 6285
Регистрация: 18.12.2011
Сообщений: 28,103
23.11.2015, 17:53 4
Повторяю, Вы должны выбрать головоломку, скопировать ее и загрузить на сайт.
После этого написать Ваш код, как Вы его понимаете!
0
4816 / 2276 / 287
Регистрация: 01.03.2013
Сообщений: 5,943
Записей в блоге: 27
24.11.2015, 00:10 5
Цитата Сообщение от ishkins Посмотреть сообщение
Функция должна быть написана по возможности в декларативном стиле с использованием рекурсии и других элементов функционального программирования.
Это точно задание по С++? Стало даже интересно, где такое задают
0
4816 / 2276 / 287
Регистрация: 01.03.2013
Сообщений: 5,943
Записей в блоге: 27
25.11.2015, 01:43 6
Мне понравилось задание (своей бескомпромиссностью) и я решил наваять кота. Встречайте - Хитори ( http://www.playsudoku.ru/hitori ), максимальный размер поля 64 клетки (8*8 при квадратном поле, но должно работать и не квадратное - не проверял). Кот полностью функционально и экологически чистый - никаких циклов, никакого изменяемого состояния - ВСЕ переменные объявлены с идентификатором const Ограничение на 64 клетки происходит понятно откуда - из-за представления ходов в виде битовых полей длинного типа. Можно сделать 2 длинных переменных в каждую функцию - тогда расширится до 128, и т.д. Можно конечно связаться с STL и их контейнерами, но не хотелось. К тому же там надо разбираться с их мутабельностью/иммутабельностью, передачей по значению и как следствие копированием и т.п. А тут просто и быстро - длинное число передается по значению через стек.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
using namespace std;
typedef const unsigned long long int cull;
typedef const int cint;
 
cull fill(cint i, cull a, cull b), solve(cull a);
 
cint w=8, h=8, po=100; cull msk = ~(~cull(0)>>h*w<<h*w);
cint f[h][w] = {
    {2,8,1,2,3,8,7,5},{7,8,6,3,3,2,5,1},{5,1,4,8,2,1,3,7},{8,4,2,8,6,5,6,3},
    {1,7,1,5,8,4,3,3},{4,1,7,8,5,8,8,2},{3,1,8,4,6,7,5,5},{5,5,1,1,3,6,4,3}};
//cint f[h][w] = {
//    {1,5,6,1,7,7,2},{1,4,6,3,2,6,5},{2,2,3,1,5,5,3},{7,7,1,1,5,2,3},
//    {6,1,2,7,7,4,4},{3,3,2,2,1,7,4},{4,6,7,1,3,1,4}};
//cint f[h][w] = {{5,3,3,2,1},{2,2,4,1,1},{1,3,2,4,3},{2,4,4,3,3},{1,1,3,5,2}};
 
const bool ib(cint i, cull a) {return (a>>i)&1;}
 
cull fill_r(cint i, cull a, cull b) {return ib(i,a) && !ib(i,b) ? b | fill(i,a,b) : b;}
 
cull fill  (cint i, cull a, cull b) {
    cint r=i/w, c=i%w; cull bc = b | cull(1)<<i;
    cull bl = c>0 ?   fill_r(i-1, a, bc) : bc;
    cull br = c<w-1 ? fill_r(i+1, a, bl) : bl;
    cull bu = r>0 ?   fill_r((r-1)*w+c, a, br) : br;
    return    r<h-1 ? fill_r((r+1)*w+c, a, bu) : bu;
}
cint fnd_1(cint i, cull a) {return ib(i,a) ? i : fnd_1(i+1,a);}
 
const bool fill_inv(cull a) {cull b = msk & ~a; return b == fill(fnd_1(0,b), b, 0);}
 
 
cull fnd_e(cint j, cint i, cint d, cull a, cint e, cull r) {
    return j ? fnd_e(j-1, i+d, d, a, e, !ib(i,a) && e==f[i/w][i%w] ? r*po+i+1 : r) : r;}
    
cull mul_ind(cint j, cint i, cint d, cull a) {
    if (j) {cull r = fnd_e(j, i, d, a, f[i/w][i%w], 0);
            return r>po ? r : mul_ind(j-1, i+d, d, a);}
    else return 0;}
                
cull s_r(cint r, cull a) {
    if (r>=h) return 0; else {cull s = mul_ind(w,r*w,1,a); return s ? s : s_r(r+1,a);}}
 
cull s_c(cint c, cull a) {
    if (c>=w) return 0; else {cull s = mul_ind(h,c,  w,a); return s ? s : s_c(c+1,a);}}
 
cull steps(cull a) {cint s=s_r(0,a); return s ? s : s_c(0,a);}
 
 
cull makestep(cint i, cull ain) {
    cint r=i/w, c=i%w; cull a = ain | cull(1)<<i;   
    return (c>0 && ib(i-1,a)) || (c<w-1 && ib(i+1,a)) || (r>0 && ib((r-1)*w+c,a))
        || (r<h-1 && ib((r+1)*w+c,a)) || !fill_inv(a) ? 0 : a;}
 
cull try_steps(cull s, cull a) {
    if (s) {cull b = makestep(s%po-1, a);
            cull c = b ? solve(b) : 0;
            return c ? c : try_steps(s/po, a);} else return 0;}
 
cull solve(cull a) {cull s=steps(a); return s ? try_steps(s,a) : a;}
 
void show(cint i, cull a) {
    if (i%w==0) cout<<'\n';
    if (i<h*w) {cout<<(a&1 ? "[" : " ")<<f[i/w][i%w]<<(a&1 ? "]" : " ")<<'\t';
                show(i+1,a>>1);} else cout<<'\n';}
 
int main() {show(0, solve(0));}
Код
 2 	[8]	 1 	[2]	 3 	 8 	 7 	[5]	
 7 	 8 	 6 	 3 	[3]	 2 	 5 	 1 	
 5 	[1]	 4 	[8]	 2 	 1 	[3]	 7 	
[8]	 4 	 2 	 8 	[6]	 5 	 6 	 3 	
 1 	 7 	[1]	 5 	 8 	 4 	 3 	[3]	
 4 	[1]	 7 	[8]	 5 	[8]	 8 	 2 	
 3 	 1 	 8 	 4 	 6 	 7 	[5]	 5 	
[5]	 5 	[1]	 1 	[3]	 6 	 4 	[3]
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2015, 01:43
Помогаю со студенческими работами здесь

Головоломка о голландском флаге
Даны три числа - a, b, c. Они равны 0,1,2, но не упорядочены. Не используя if поменять их местами...

Головоломка морской бой
Помогите написать головоломку морской бой. Необходимо чтобы программа могла рандомно создавать ее,...

головоломка для знающих...
Описать функцию Ln1(x, ) вещественного типа (параметры x,  — вещественные, |x| &lt; 1,  &gt;...

Головоломка ханойские башни
Нужно переложить всю пирамиду с 1 столба на 3 за минимальное количество ходов Напишите программу,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru