제출 #1154593

#제출 시각아이디문제언어결과실행 시간메모리
1154593gelastropodSelotejp (COCI20_selotejp)C++20
0 / 110
1 ms1092 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

signed main() {
	int n, m;
	cin >> n >> m;
	string s;
	vector<vector<int>> closed(n, vector<int>(m, false));
	for (int i = 0; i < n; i++) {
		cin >> s;
		for (int j = 0; j < m; j++) {
			if (s[j] == '#')
				closed[i][j] = true;
		}
	}
	vector<vector<vector<int>>> mem(n, vector<vector<int>>(m, vector<int>(1LL << m, -1)));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			for (int k = 0; k < (1LL << m); k++) {
				if (i == 0 && j == 0) {
					mem[i][j][k] = closed[i][j];
					continue;
				}
				if (!closed[i][j]) {
					mem[i][j][k] = min(mem[i - (j == 0)][(j + m - 1) % m][k], mem[i - (j == 0)][(j + m - 1) % m][k ^ (1LL << j)]);
					continue;
				}
				if (j != 0 && !((k && (1LL << j)) || (k && (1LL << (j - 1))))) {
					mem[i][j][k] = min(mem[i][j - 1][k], mem[i][j - 1][k ^ (1LL << j)]);
					if (!closed[i][j - 1]) {
						mem[i][j][k]++;
					}
					continue;
				}
				if (j == 0 || !(k && (1LL << j)) && (k && (1LL << (j - 1)))) {
					mem[i][j][k] = min(mem[i - (j == 0)][(j + m - 1) % m][k], mem[i - (j == 0)][(j + m - 1) % m][k ^ (1LL << j)]) + 1;
					continue;
				}
				if (k && (1LL << j)) {
					if (i != 0 && closed[i - 1][j]) {
						mem[i][j][k] = min(mem[i - (j == 0)][(j + m - 1) % m][k], mem[i - (j == 0)][(j + m - 1) % m][k ^ (1LL << j)] + 1);
					}
					else {
						mem[i][j][k] = min(mem[i - (j == 0)][(j + m - 1) % m][k], mem[i - (j == 0)][(j + m - 1) % m][k ^ (1LL << j)]) + 1;
					}
					continue;
				}
			}
		}
	}
	int ans = INT_MAX;
	for (int i : mem[n - 1][m - 1])
		ans = min(ans, i);
	cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...