題目連結: https://zerojudge.tw/ShowProblem?problemid=d596
# 內容
在一個九宮格裡(即如下的井字形),某一個格子下被放置一顆地雷。為了
找出這個地雷的所在,九宮格的主人會透露出以下的訊息:
- 一個與地雷格相鄰的格子
- 兩個與地雷格不相鄰的格子
此處所指的相鄰為橫向或縱向,不包括對角。比如,5 號格的相鄰格號碼為
2, 4, 6, 8;4 號的相鄰格號碼則為 1, 5, 7;以此類推。
請寫一支程式來列出所有可能被放置地雷的格子號碼。
# 解題思路
從可能的格子 (near) 尋找四周 (超界就忽略),可能的四周 (y1,x1) 的四周有任何一格 (y2,x2) 有撞到不相鄰的格子,則 (y1,x1) 就不會是正解。
# 程式碼
#include <bits/stdc++.h>
#define ll long long
#define speed ios::sync_with_stdio(false);cin.tie(0)
using namespace std;
int main() {
int t, near, no1, no2, x1, y1, x2, y2, dx[4] = { 0, -1, 1, 0 }, dy[4] = { -1, 0, 0, 1 };
string matrix[3] = { "123", "456", "789" };
bool have, can;
cin >> t;
speed;
while (t--) {
cin >>near>> no1 >>no2, have = false;
for (int i = 0; i < 4; i++) {
x1 = (near - 1) % 3 + dx[i];
y1 = (near - 1) / 3 + dy[i];
if (x1 < 0 || x1 >= 3 || y1 < 0 || y1 >= 3)
continue;
can = true;
for (int j = 0; j < 4; j++) {
x2 = x1 + dx[j], y2 = y1 + dy[j];
if (x2 < 0 || x2 >= 3 || y2 < 0 || y2 >= 3)
continue;
if (matrix[y2][x2] - '0' == no1 || matrix[y2][x2] - '0' == no2) {
can = false;
break;
}
}
if (can)
cout << matrix[y1][x1] << ' ', have = true;
}
if (!have)
cout << "Empty";
cout << '\n';
}
}