随便发一个
2025-05-06 21:41:31
发布于:北京
10阅读
0回复
0点赞
#include <iostream>
#include <vector>
using namespace std;
int n, m, xi, xj, ok;
vector<string> ans;
void pr(vector<vector<char> > &mp, int mode = -1) {
if (mode == -1) return ;
if (mode == -1) cout << "--------" << endl;
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++) {
if (mode == -1) cout << mp[i][j];
if (mode == 0 && mp[i][j] == '.') {
cout << i << " " << j << endl;
return ;
}
}
if (mode == -1) cout << endl;
}
if (mode == -1) cout << "PRPRPRPRPR" << endl;
}
// 交换行
void spcol(int x, int y, vector<vector<char> > &mp) {
for (int i = 1; i <= n; i ++) swap(mp[i][x], mp[i][y]);
}
// 构造操作行
void pickopr(string ch, int from, int to) {
string opr = ch + " ";
opr += to_string(from) + " ";
opr += to_string(to);
// cout << opr << endl;
ans.push_back(opr);
}
// 锁定左上角,所有的情况转换为左上角锁定
void UL(int x, int y, vector<vector<char> > &mp) {
if (x != n) { swap(mp[x], mp[n]); pickopr("r", x, n); }
if (y != m) { spcol(y, m, mp); pickopr("l", y, m); }
int lt = m - 1, up = n - 1;
while (lt >= 1 && mp[n][lt] != '#') lt --;
while (up >= 1 && mp[up][m] != '#') up --;
if (lt != m - 1) { spcol(lt, m - 1, mp); pickopr("l", lt, m - 1); }
if (up != n - 1) { swap(mp[up], mp[n - 1]); pickopr("r", up, n - 1); }
}
// 右上角,转为左上角
void UR(int x, int y, vector<vector<char> > &mp) {
int rt = y + 1;
while (rt <= m && mp[x][rt] != '#') rt ++;
spcol(y, rt, mp); pickopr("l", y, rt);
UL(x, rt, mp);
}
// 左下角,转为左上角
void DL(int x, int y, vector<vector<char> > &mp) {
int dn = x + 1;
while (dn <= n && mp[dn][y] != '#') dn ++;
swap(mp[dn], mp[x]); pickopr("r", x, dn);
UL(dn, y, mp);
}
// 右下角,转为左上角
void DR(int x, int y, vector<vector<char> > &mp) {
int dn = x + 1;
while (dn <= n && mp[dn][y] != '#') dn ++;
swap(mp[dn], mp[x]); pickopr("r", x, dn);
UL(dn, y, mp);
}
int main () {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m;
vector<vector<char> > mp(n + 10, vector<char>(m + 10));
vector<vector<int > > L (n + 10, vector<int >(m + 10)); // 左
vector<vector<int > > R (n + 10, vector<int >(m + 10)); // 右
vector<vector<int > > U (n + 10, vector<int >(m + 10)); // 上
vector<vector<int > > D (n + 10, vector<int >(m + 10)); // 下
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++) {
cin >> mp[i][j];
if (mp[i][j] == 'X') xi = i, xj = j;
if (mp[i][j] == '#') R[i][0] ++, D[0][j] ++;
}
}
// 锁点
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++) {
L[i][j] = L[i][j - 1] + (mp[i][j - 1] == '#');
R[i][j] = R[i][j - 1] - (mp[i][j] == '#');
U[i][j] = U[i - 1][j] + (mp[i - 1][j] == '#');
D[i][j] = D[i - 1][j] - (mp[i][j] == '#');
if (mp[i][j] == '.' || mp[i][j] == 'X') {
if (U[i][j] != 0 && L[i][j] != 0) {
UL(i, j, mp); ok = 1;
} else if (U[i][j] != 0 && R[i][j] != 0) {
UR(i, j, mp); ok = 1;
} else if (D[i][j] != 0 && L[i][j] != 0) {
DL(i, j, mp); ok = 1;
} else if (D[i][j] != 0 && R[i][j] != 0) {
DR(i, j, mp); ok = 1;
}
}
if (ok == 1) {
cout << "Yes" << endl;
cout << ans.size() << endl;
for (auto it : ans) { cout << it << endl; }
if (mp[n][m] == 'X') { pr(mp, 0); }
else if (mp[n][m] == '.') { cout << n << " " << m << endl; }
return 0;
}
}
}
// 锁 r 边
for (int i = 1; i <= n; i ++) {
if (R[i][0] == m) {
int fd = -1;
for (int fi = 1; fi <= n; fi ++) {
if (fi == i || fi == xi || R[fi][0] == m) continue;
// xi, i, fi
ok = 1;
if (xi > i) {swap(mp[xi], mp[i]); pickopr("r", xi, i); swap(xi, i); }
if (xi > fi) {swap(mp[xi], mp[fi]); pickopr("r", xi, fi); swap(xi, fi); }
if (i > fi) { swap(mp[i], mp[fi]); pickopr("r", i, fi); swap(i, fi); }
cout << "Yes" << endl;
cout << ans.size() << endl;
for (auto it : ans) { cout << it << endl; }
for (int j = 1; j <= m; j ++) {
if (mp[fi][j] == '.') {
cout << fi << " " << j << endl;
break;
}
}
return 0;
}
if (fd == -1) break;
}
}
// 锁 l 列
for (int j = 1; j <= m; j ++) {
if (D[0][j] == n) {
int fd = -1;
for (int fj = 1; fj <= m; fj ++) {
if (fj == j || fj == xj || D[0][fj] == n) continue;
// xj, i, fi
ok = 1;
if (xj > j) {spcol(xj, j, mp); pickopr("l", xj, j); swap(xj, j); }
if (xj > fj) {spcol(xj, fj, mp); pickopr("l", xj, fj); swap(xj, fj); }
if (j > fj) { spcol(j, fj, mp); pickopr("l", j, fj); swap(j, fj); }
cout << "Yes" << endl;
cout << ans.size() << endl;
for (auto it : ans) { cout << it << endl; }
for (int i = 1; i <= n; i ++) {
if (mp[i][fj] == '.') {
cout << i << " " << fj << endl;
break;
}
}
return 0;
}
if (fd == -1) break;
}
}
if (ok == 0) cout << "No" << endl;
return 0;
}
这里空空如也
有帮助,赞一个