Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задача "Сапер" на c++.Помогите пожалуйста

Sweet Ученик (233), закрыт 6 месяцев назад
Сапёр
Вам необходимо построить поле для игры «Сапёр» по его конфигурации — высоте, ширине и координатам расставленных на нем мин.

Вкратце напомним правила построения поля для игры «Сапёр»:

поле состоит из клеток с минами и пустых клеток;
клетки с миной обозначаются символом *;
пустые клетки содержат число от 0 до 8 — количество мин на соседних клетках.
Формат ввода
В первой строке содержатся три числа:

число
m
m от 1 до 100 — количество строк на поле;
число
n
n от 1 до 100 — количество столбцов на поле;
число
k
k от 0 до
m
n
mn — количество мин на поле.
В следующих
k
k строках содержатся пары чисел с координатами мин (номерами строки и столбца). Нумерация ведётся с единицы.

Формат вывода
Выведите построенное поле, разделяя строки поля символом \n, а столбцы — пробелом.
Лучший ответ
Папа Высший разум (153851) 7 месяцев назад
Элементарно:
 #include 
#include

using namespace std;

int main() {
uint n, m, k;
cin >> m >> n >> k;
bitset<100> field[m];
fill(field, field + m, 0);
for (uint x = 0; x < k; x++) {
uint u, v;
cin >> u >> v;
field[u-1][v-1] = 1;
}
for (uint i = 0; i < m; i++) {
const char *sep = "";
for (uint j = 0; j < n; j++) {
char c;
if (field[i][j]) {
c = '*';
} else {
c = '0';
if (i && j) c += field[i-1][j-1];
if (i) c += field[i-1][j];
if (i && j + 1 < n) c += field[i-1][j+1];
if (j) c += field[i][j-1];
if (j + 1 < n) c += field[i][j+1];
if (i + 1 < m && j) c += field[i+1][j-1];
if (i + 1 < m) c += field[i+1][j];
if (i + 1 < m && j + 1 < n) c += field[i+1][j+1];
}
cout << sep << c;
sep = " ";
}
cout << endl;
}

return 0;
}

Вводим все чиселки со стандартного ввода в формате, указанном в задании. В коде это - первый цикл.
По мере ввода координат мин сразу отмечаем их на поле (не забывая нормализовывать индексы: во входных данных они идут с единицы, а у нас - с нуля).
Для хранения каждой строки поля используется битовое множество: 0 - нет мины, 1 - есть мина.
Используются младшие n бит из каждой строки, и всего под поле выделяем m строк, т.е. массив из m битовых множеств.

Как все мины отмечены, проходим по каждой ячейке, и если в ней нет мины, то вычисляем количество соседних мин, заглядывая в каждую соседнюю ячейку, при этом не выходя за границы поля. Выводим соответствующий символ (от '0' до '8', в таблице ASCII они идут подряд и по порядку).
Если же есть мина, то выводим '*' и к соседям не заглядываем.
Перед символом первой колонки выводим пустую строку, а перед каждым последующим - пробел.
SweetУченик (233) 7 месяцев назад
можете рассказать решение
Папа Высший разум (153851) Sweet, дополнил ответ.
Остальные ответы
Похожие вопросы