Алгоритм игры "Кварт"
В игре "Quath" вы заполняете блок и превращаете его в прямоугольник. Блок будет удален.
Нормальное стирание
[
[1,1,1,1,1],
[1,0,0,0,0]
]
// when rectangle complete ⤵️
[
[1,1,1,1,1],
[1,1,1,1,1]
]
Стирание цепи
Но если два блока соединены, когда они станут большим прямоугольником, они будут стерты вместе.
[
[1,1,1,1],
[1,0,0,1],
[1,2,2,1],
[0,0,2,0],
[0,0,2,0]
]
//when rectangle complete,two block erase at same time
[
[1,1,1,1],
[1,0,0,1],
[1,2,2,1],
[1,2,2,1],
[1,2,2,1]
]
Макет блока кажется более сложным в реальной игре.
Я хочу знать, как судить, что является самым большим прямоугольником на карте.
1 ответ
стереть целевое изображение
нашел решение этого вопроса на себе.
используйте картинку выше, например.
дать каждому блоку идентификатор, тогда карта может быть выражена в виде массива ниже
[
[a,a,a,a,a,b,b,b,0,0,0,0]
[d,d,a,c,c,c,c,b,0,i,i,i]
[d,0,0,0,0,0,0,b,h,h,h,i]
[d,0,0,0,0,0,0,g,g,g,h,i]
[d,0,0,0,0,f,f,f,f,g,h,0]
[d,e,e,e,e,0,0,0,0,g,0,0]
]
попробуйте заполнить блок "F"
[
[a,a,a,a,a,b,b,b,0,0,0,0]
[d,d,a,c,c,c,c,b,0,i,i,i]
[d,0,0,0,0,0,0,b,h,h,h,i]
[d,0,0,0,0,0,0,g,g,g,h,i]
[d,0,0,0,0,f,f,f,f,g,h,0]
[d,e,e,e,e,f,f,f,0,g,0,0]
]
переместите курсор в направлении 4, если найдете 0, уменьшите высоту или ширину прямоугольника
получить прямоугольник ниже, я назвал его "связанный ходок"
[
[a,a,a,a,a,b,b,b]
[d,d,a,c,c,c,c,b]
[d,0,0,0,0,0,0,b]
[d,0,0,0,0,0,0,g]
[d,0,0,0,0,f,f,f]
[d,e,e,e,e,f,f,f]
]
но части "блока я" все еще снаружи большого прямоугольника
мы можем удалить область прямоугольника в массиве карты,
и найти там есть части блока осталось
если не осталось частей, мы можем стереть большой прямоугольник
продолжать заполнять "блок F" "связанный ходок" может легко найти его стать заполненным прямоугольником и стереть его
затем попробуйте заполнить "блок г"
мы получим такой прямоугольник
[
[b,h,h]
[g,g,g]
[g,g,g]
[g,g,g]
]
прямоугольник включает в себя прямоугольник необходимо стереть
поэтому нам нужно удалить лишние части, а затем стереть нужную область
шаги, чтобы судить:
1. стрелять блоки, блок станет частью набора блоков
2. запустить "связанный ходок"
3.Если прямоугольник результата имеет только один столбец или строку, это не допустимый прямоугольник (конечный судья)
4. найти дополнительные части в прямоугольнике
5. если нет, стереть прямоугольник (конечный судья)
6.Если да, удалите лишние детали, найдите прямоугольник слева, снова бегите с ограниченным ходом (конечный судья)
я думаю, что это не лучший способ решить этот вопрос.
это может быть очень медленно, у кого-нибудь есть идея?