题目
题意
给定初始图像,“*”代表图标,“."代表此位置没有东西,要让图标整齐的按列排放,最少需要移动多少个图标,给定坐标,若此位置上没有图标,则放置图标,若此位置上有图标,则将图标移除
思路
将二维坐标转变为一维坐标,然后模拟移动
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ll n, m, t;
cin >> n >> m >> t;
char a[1005][1005], b[1005*1005];
int ans = 0;
for (ll i = 1; i <= n; i++) {
for (ll j = 1; j <= m; j++) {
cin >> a[i][j];
if (a[i][j] == '*') ans++;
b[(j - 1) * n + i] = a[i][j];//转换为一维坐标
}
}
int sum = 0;
for (int i = ans + 1; i <= n * m; i++) if (b[i] == '*') sum++;//记录需要移动的次数
while (t--) {
ll x, y;
cin >> x >> y;
ll p = (y - 1) * n + x;//转换为一维坐标
if (b[p] == '*') {//若一维坐标里存的是图标
b[p] = '.';//则拿走图标
if (p > ans) sum--;//如果拿走的图标在需要移动的次数里面,则少移动一次、
if (p != ans && b[ans] == '*') sum++;//此位置已经是摆放好图标的位置,则多移动一次
ans--;//图标减1
} else {//此位置无图标
b[p] = '*';//放入图标
ans++;//图标增加
if (p > ans) sum++;//放入的图标在需要移动的次数里面,则需要多移动一次
if (p != ans && b[ans] == '*') sum--;//此位置是已经摆放好图标的位置,则少移动一次
}
cout << sum << endl;
}
return 0;
}