Aya_tt @ 2023-12-25 20:44:16
#include<bits/stdc++.h>
using namespace std;
int n, T, ans[1010][1010], cnt, dir[4][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
char mp[1010][1010];
bool vis[1010][1010];
queue<pair<int, int> > q;
int main(){
cin >> n >> T;
for(register int i = 1;i <= n;i++){
for(register int j = 1;j <= n;j++){
//char a;
//scanf("%c", &a);
//mp[i][j] = a;
cin >> mp[i][j];
}
}
while(T--){
int a, b;
scanf("%d%d", &a, &b);
if(ans[a][b] > 0){
cout << ans[a][b] << endl;
continue;
}
memset(vis, 0, sizeof vis);
while(!q.empty()){
q.pop();
}
queue<pair<int, int> > t;
q.push(make_pair(a, b));
t.push(make_pair(a, b));
vis[a][b] = 1;
cnt = 1;
while(!q.empty()){
int x = q.front().first, y = q.front().second;
q.pop();
for(int i = 0;i < 4;i++){
int xx = x + dir[i][0], yy = y + dir[i][1];
if(!vis[xx][yy] && xx >= 1 && yy >= 1 && xx <= n && yy <= n && mp[xx][yy] != mp[x][y]){
cnt++;
q.push(make_pair(xx, yy));
t.push(make_pair(xx, yy));
vis[xx][yy] = 1;
}
}
}
while(!t.empty()){
int x = t.front().first, y = t.front().second;
ans[x][y] = cnt;
t.pop();
}
cout << ans[a][b] << endl;
}
}
结果无误,但是TLE了第二个点
by L_MaJiaQi @ 2023-12-25 21:00:29
@Aya_tt scanf好像读不了char
by Terrible @ 2023-12-25 21:02:50
scanf("%c",&c);
等于 getchar()
等于 cin.get()
。
scanf(" %c",&c);
等于 cin>>c;
。
scanf
格式串中的空格表示将此处的空白字符(空格换行回车制表等)都筛去。
by Terrible @ 2023-12-25 21:03:54
字符串形式读入应该是:
for(register int i = 1;i <= n;i++){
//for(register int j = 1;j <= n;j++){
//char a;
scanf("%s", mp[i]+1);
//}
}
by Terrible @ 2023-12-25 21:07:37
TLE 的话是说你的程序做法需要再优化一下,打开题解区看看,可以只跑一遍完整地图就可以出所有询问的结果,你这样跑了 m 轮,是没有必要的,而且几乎不可能在 1s 内跑完。
by I_like_play_eggy @ 2024-03-30 22:07:32
我直接 string