стереть целевое изображение
нашел решение для этого вопроса на себе.
используйте картинку выше, например.
присвойте каждому блоку идентификатор ,, тогда карта может быть выражена в виде массива ниже
[
[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]
]
но части "блока i" все еще находятся снаружи большого прямоугольника
мы можем удалить область прямоугольника в массиве карты,
и найти там есть блок частей осталось
если не осталось частей, мы можем стереть большой прямоугольник
продолжить заполнять "блок f"
«связанный ходок» может легко найти его в виде заполненного прямоугольника и стереть его
затем попробуйте заполнить "блок g"
мы получим прямоугольник как это
[
[b,h,h]
[g,g,g]
[g,g,g]
[g,g,g]
]
прямоугольник включает прямоугольник, который необходимо стереть
поэтому нам нужно удалить лишние части, а затем стереть нужную область
шагов, чтобы судить:
1. снимать блоки, блок станет частью набора блоков
2. запустить "связанный ходок"
3.Если прямоугольник результата имеет только один столбец или строку, это не допустимый прямоугольник (конечный судья)
4. найти дополнительные части в прямоугольнике
5. если нет, стереть прямоугольник (конечный судья)
6.Если да, удалите лишние детали, найдите прямоугольник слева, снова бегите бегом (конечный судья)
я думаю, что это не лучший способ решить этот вопрос.
это может быть очень медленно, у кого-нибудь есть идея?