我当模拟写的,拿到了前两个sub的分,但是后面的点不知道怎么优化
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n , m;
const int N = 1010;
int a[N][N];
int t[N][N];
int ans;
void g(int x){
if(x == 0){
for(int j = 1;j <= n;j++){
for(int i = n;i;i--){
if(a[i][j] == 1){
int f = i;
while(f < n){
if(a[f + 1][j] == 0){
swap(a[f][j] , a[f + 1][j]);
}
f++;
}
}
}
}
}
else{
for(int i = n;i;i--){
if(a[i][x] == 1){
int f = i;
while(f < n){
if(a[f + 1][x] == 0){
swap(a[f][x] , a[f + 1][x]);
}
f++;
}
}
}
}
}
void left(){
int j = 1;
for(int x = 1;x <= n;x++){
for(int y = n , i = 1;y && i <= n;y-- , i++){
t[i][j] = a[x][y];
}
j++;
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
a[i][j] = t[i][j];
}
}
}
void right(){
int j = 1;
for(int x = n;x;x--){
for(int y = 1 , i = 1;y <= n && i <= n;y++ , i++){
t[i][j] = a[x][y];
}
j++;
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
a[i][j] = t[i][j];
}
}
}
int main(){
cin >> n >> m;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
char x;
cin >> x;
a[i][j] = x ^ 48;
}
}
g(0);
while(m--){
char opt;
int x , y;
cin >> opt;
scanf("%d%d" , &x , &y);
if(opt == 'L') left();
else if(opt == 'R') right();
g(0);
if(a[x][y] == 0) ++ans;
else{
a[x][y] = 0;
g(y);
}
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
cout << a[i][j];
}
cout << endl;
}
cout << ans << endl;
return 0;
}