【題解】Zerojudge e605 - 10189 - Minesweeper

題目大意

給定踩地雷的地圖,求每個位置的八方位內有幾個地雷。

題解

對於每個位置,我們都需要檢查他的 $8$ 個方位是否有地雷。在實作上可以用一個陣列儲存每個方位 $x$ 和 $y$ 的改變量,用迴圈直接遍歷,可以讓實作簡單許多。詳細的做法請參考 code。
#include <bits/stdc++.h>
using namespace std;

const int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
const int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n, m;
	int id = 1;
	while(cin >> n >> m && (n && m)) {
		vector<string> grid(n);
		for(int i = 0; i < n; i++) {
			cin >> grid[i];
		}
		vector<vector<int>> ans(n, vector<int>(m));
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				if(grid[i][j] == '.') {
					int cnt = 0;
					for(int dir = 0; dir < 8; dir++) {
						int ni = i + dx[dir];
						int nj = j + dy[dir];
						if(ni >= 0 && ni < n && nj >= 0 && nj < m && grid[ni][nj] == '*') {
							cnt++;
						}
					}
					ans[i][j] = cnt;
				}
			}
		}
		cout << "Field #" << id++ << ":\n";
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				if(grid[i][j] == '*') {
					cout << "*";
				} else {
					cout << ans[i][j];
				}
			}
			cout << "\n";
		}
		cout << "\n";
	}
	return 0;
}

如果本文對您有幫助的話幫忙點擊廣告和分享吧!

© 若無特別註明,本站文章皆由 WeakMouse's Coding Blog 原創 ,轉載引用本文前請先留言告知。本文轉載請註明文章源自 WeakMouse's Coding Blog ,作者 ,並附上原文連結: 【題解】Zerojudge e605 - 10189 - Minesweeper

張貼留言

0 留言