Сапер: как избавиться от множества if - Free Pascal
Формулировка задачи:
Помогите с задачей, потому что здесь много условий с if и я, кажеться, уже запуталась. Может есть путь покороче? Какой подход к задаче выбрать лучше? вот условие:
Мальчику Васе очень нравится известная игра "Сапер" ("Minesweeper").
В "Сапер" играет один человек. Игра идет на клетчатом поле (далее будем называть его картой) NxM (N строк, M столбцов). В K клетках поля стоят мины, в остальных клетках записано либо число от 1 до 8 — количество мин в соседних клетках, либо ничего не написано, если в соседних клетках мин нет. Клетки являются соседними, если они имеют хотя бы одну общую точку, в одной клетке не может стоять более одной мины. Изначально все клетки поля закрыты. Игрок за один ход может открыть какую-нибудь клетку. Если в открытой им клетке оказывается мина — он проигрывает, иначе игроку показывается число, которое стоит в этой клетке, и игра продолжается. Цель игры — открыть все клетки, в которых нет мин.
У Васи на компьютере есть эта игра, но ему кажется, что все карты, которые в ней есть, некрасивые и неинтересные. Поэтому он решил нарисовать свои. Однако фантазия у него богатая, а времени мало, и он хочет успеть нарисовать как можно больше карт. Поэтому он просто выбирает N, M и K и расставляет мины на поле, после чего все остальные клетки могут быть однозначно определены. Однако на определение остальных клеток он не хочет тратить свое драгоценное время. Помогите ему!
По заданным N, M, K и координатам мин восстановите полную карту.
Входные данные
В первой строке входного файла INPUT.TXT содержатся числа N, M и K (1<=N<=200, 1<=M<=200, 0<=K<=N*M). Далее идут K строк, в каждой из которых содержится по два числа, задающих координаты мин. Первое число в каждой строке задает номер строки клетки, где находится мина, второе число — номер столбца. Левая верхняя клетка поля имеет координаты (1,1), правая нижняя — координаты (N,M).
Выходные данные
Выходной файл OUTPUT.TXT должен содержать N строк по M символов — соответствующие строки карты. j-й символ i-й строки должен содержать символ ‘*‘ (звездочка) если в клетке (i,j) стоит мина, цифру от 1 до 8, если в этой клетке стоит соответствующее число, либо ‘.‘ (точка), если клетка (i,j) пустая.
Пример
Входные данные:
10 9 23
1 8
2 3
3 2
3 3
4 3
5 7
6 7
7 1
7 2
7 3
7 4
7 5
7 6
7 7
7 8
8 1
8 3
8 5
8 7
9 3
9 5
9 6
9 7
Выходные данные:
.111..1*1
13*2..111
1**3.....
13*2.111.
.111.2*2.
233335*41
********1
*6*7*8*41
13*4***2.
.1122321.
Решение задачи: «Сапер: как избавиться от множества if»
textual
Листинг программы
const maxel=200; var buf: array [1..maxel,1..maxel] of byte; fin,fout:text; i,j,t,n,m:byte; k:word; begin for i:=1 to maxel do for j:=1 to maxel do buf[i,j]:=0; assign(fin,'input.txt'); reset(fin); readln(fin,n,m,k); for t:=1 to k do begin readln(fin,i,j); buf[i,j]:=$80; if (i>1) then begin buf[i-1,j]:=buf[i-1,j]+1; if (j>1) then buf[i-1,j-1]:=buf[i-1,j-1]+1; end; if (i<maxel) then begin buf[i+1,j]:=buf[i+1,j]+1; if (j<maxel) then buf[i+1,j+1]:=buf[i+1,j+1]+1; end; if (j>1) then begin buf[i,j-1]:=buf[i,j-1]+1; if (i<maxel) then buf[i+1,j-1]:=buf[i+1,j-1]+1; end; if (i<maxel) then begin buf[i,j+1]:=buf[i,j+1]+1; if (i>1) then buf[i-1,j+1]:=buf[i-1,j+1]+1; end; end; close(fin); assign(fout,'output.txt'); rewrite(fout); for i:=1 to n do begin for j:=1 to m do if buf[i,j]>=$80 then write(fout,'*') else if buf[i,j]=0 then write(fout,'.') else write(fout,buf[i,j]); writeln(fout); end; close(fout); end.
Объяснение кода листинга программы
В этом коде представлена простая реализация игры Сапер
на языке Free Pascal. Вот список действий, которые происходят в коде:
- Инициализация массива buf, который представляет собой двумерный массив, размером maxel x maxel, и заполняется нулями.
- Открытие файла input.txt для чтения и записи данных.
- Чтение из файла input.txt четырех чисел: n, m, k и некоторого третьего числа, которое не используется в этой реализации.
- В цикле t от 1 до k происходит чтение из файла input.txt двух чисел i и j, и затем запись в массив buf значения $80.
- Если i > 1, то в массив buf записывается значение buf[i-1,j] + 1.
- Если i < maxel, то в массив buf записывается значение buf[i+1,j] + 1.
- Если j > 1, то в массив buf записывается значение buf[i,j-1] + 1.
- Если i < maxel, то в массив buf записывается значение buf[i,j+1] + 1.
- Закрытие файла input.txt.
- Открытие файла output.txt для записи данных.
- В цикле i от 1 до n происходит заполнение файла output.txt значениями массива buf. Если значение buf[i,j] больше или равно $80, то записывается символ '*'. Если значение buf[i,j] равно 0, то записывается символ '.'. В противном случае записывается само значение buf[i,j].
- Закрытие файла output.txt.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д