A
给定一个3*3的数独矩阵,请你判断这一数独矩阵是一解、多解、还是无解。
数独规则如下:
- 每一行中不能有重复数字
- 每一列中不能有重复数字
- 每一块中不能有重复数字
其中,块是题目中给定的三个坐标。保证每一块中都有三个坐标,一共有三个块。
对于一个3*3的数独矩阵,其左上角坐标是,右下角坐标是
输入
共有组输入,每组输入包含一个3*3的数独矩阵,和三行描述块坐标的信息。
*表示该位置待填充,数字表示该位置已填充对应数字。
每一行中有三个坐标,表示一个块内的坐标,保证坐标位置合法。
输出
如果一解,输出“Unique”,并输出对应解法;
如果多解,输出“Multiple”;
如果无解,输出“No”。
solution
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
const int N = 5;
char a[N][N], ans[N][N];
vector<pair<int, int>> v[4];
int flag;
bool used[5];
bool chk() {
// line
rep(i, 1, 3) {
rep(k, 1, 3) used[k] = 0;
rep(j, 1, 3) {
int x = a[i][j] - '0';
if (used[x]) return 0;
used[x] = 1;
}
}
// row
rep(j, 1, 3) {
rep(k, 1, 3) used[k] = 0;
rep(i, 1, 3) {
int x = a[i][j] - '0';
if (used[x]) return 0;
used[x] = 1;
}
}
rep(b, 1, 3) {
rep(k, 1, 3) used[k] = 0;
for (auto [u, v] : v[b]) {
int x = a[u][v] - '0';
if (used[x]) return 0;
used[x] = 1;
}
}
return 1;
}
vector<pair<int, int>> em;
int len;
void dfs(int p) {
if (p == len) {
if (chk()) {
++flag;
rep(i, 1, 3) rep(j, 1, 3) ans[i][j] = a[i][j];
}
return;
}
if (flag >= 2) return;
rep(i, 1, 3) {
int x = em[p].first, y = em[p].second;
a[x][y] = i + '0';
dfs(p + 1);
}
}
void solve() {
flag = 0;
em.clear();
rep(i, 1, 3) cin >> a[i] + 1;
rep(i, 1, 3) v[i].clear();
int x, y;
rep(i, 1, 3) {
rep(j, 1, 3) {
cin >> x >> y;
++x, ++y;
v[i].emplace_back(x, y);
if (a[i][j] == '*') em.emplace_back(i, j);
}
}
len = em.size();
dfs(0);
if (flag == 1) {
cout << "Unique\n";
rep(i, 1, 3) cout << ans[i] + 1 << '\n';
} else if (flag == 0)
cout << "No\n";
else
cout << "Multiple\n";
}
int main() {
int T;
cin >> T;
while (T--) solve();
return 0;
}
/*
4
*2*
1*2
***
0 0 0 1 1 0
0 2 1 1 1 2
2 0 2 1 2 2
**3
***
***
0 0 1 0 1 1
0 1 0 2 1 2
2 0 2 1 2 2
**3
1**
**2
0 0 1 0 1 1
0 1 0 2 1 2
2 0 2 1 2 2
3*3
1**
**2
0 0 1 0 1 1
0 1 0 2 1 2
2 0 2 1 2 2
*/
B
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
const int N = 55;
char a[N][N];
int dx[] = {1, -1, 0, 0, 1, 1, -1, -1};
int dy[] = {0, 0, 1, -1, 1, -1, -1, 1};
int n, m;
char tar;
map<pair<int, int>, int> mp;
int dir;
bool out(int x, int y) { return x < 1 || x > n || y < 1 || y > n; }
void getfar(int x, int y, int i, int &d, int &xx, int &yy) {
int dep = 0;
while (!out(x + dx[i], y + dy[i])) {
// cerr << "far " << i << ' ' << x << ' ' << y<<'\n';
x += dx[i];
y += dy[i];
++dep;
if (tar == a[x][y] && dep > d) {
d = dep;
// dir = i;
xx = x, yy = y;
} else if (a[x][y] != 'b' && a[x][y] != 'w')
return;
}
}
void trans(char &tar) {
if (tar == 'w')
tar = 'b';
else
tar = 'w';
}
int cir;
void op() {
int x, y;
cin >> x >> y;
++x, ++y;
a[x][y] = tar;
trans(tar);
++cir;
rep(i, 0, 7) {
int dis = 0;
int xx = x, yy = y;
getfar(x, y, i, dis, xx, yy);
if (dis >= 2) {
int nx = x, ny = y;
// cout << i << ' ' << xx << ' ' << yy << ' ' << dis << '\n';
while (x != xx || y != yy) {
x += dx[i];
y += dy[i];
// cerr<<x<<' '<<y<<endl;
if (x == xx && y == yy) break;
if (!(mp.count({x, y}) && mp[{x, y}] == cir - 1)) {
// cerr<<"trans "<<x<<' '<<y<<endl;
mp[{x, y}] = cir;
trans(a[x][y]);
}
}
x = nx; y = ny;
}
}
}
void solve() {
memset(a, 0, sizeof a);
mp.clear();
tar = 'w';
cir = 0;
cin >> n >> m;
rep(i, 1, n) cin >> a[i] + 1;
while (m--) {
op();
}
rep(i, 1, n) cout << a[i] + 1 << '\n';
cout << "END\n";
}
int main() {
int T;
cin >> T;
while (T--) solve();
return 0;
}
/*
2
6 4
------
---b--
-wwwb-
-bbw--
-ww---
-ww---
1 2
0 2
2 0
2 5
6 4
------
--b---
--wbb-
--www-
--b-b-
--w---
1 4
1 1
5 4
0 2
*/
/*
--b---
--bb--
wbwbwb
-www--
-wb---
-ww---
END
--b---
-bw-w-
--wbw-
--bwb-
--w-w-
--w-w-
END
*/
C
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
const int N = 55;
char g[N][N];
int a[N];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
vector<pair<int, int>> E, F;
int flag, n, m, A, B;
int getDis(int x, int y, int xx, int yy) { // bfs
return abs(x - xx) + abs(y - yy);
}
void solve() {
flag = 0;
cin >> n >> m >> A >> B;
rep(i, 0, A - 1) cin >> a[i];
rep(i, 1, n) cin >> g[i] + 1;
if (A < B) {
cout << -1 << '\n';
return;
}
rep(i, 1, n) rep(j, 1, m) {
if (g[i][j] == 'E') {
E.emplace_back(i, j);
} else if (isdigit(g[i][j])) {
F.emplace_back(i, j);
}
}
vector<int> val;
for (int i = 0; i < E.size(); ++i) val.push_back(INT_MAX);
for (auto f : F)
for (int i = 0; i < E.size(); ++i) {
int x = getDis(f.first, f.second, E[i].first, E[i].second);
val[i] = min(val[i], x);
}
long long ans = 0;
for (int x : val) ans += x;
if (ans > INT_MAX)
cout << -1 << '\n';
else
cout << ans << '\n';
}
int main() {
int T;
cin >> T;
while (T--) solve();
return 0;
}