刚才在洛谷做了一道bfs的题目,不想让昨天dhz大佬讲的bfs白讲了
如图 这就是dhz大佬的真面目哈哈哈哈
但是刚开始自己一边看着题解一边自己打了一下,发现超时了三个点,怎么优化,关同步都不顶用,下面贴一下我的超时代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
char mp[2000][2000];
bool bk[2000][2000];
int step[2000][2000];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int ans;
int sx,sy;
struct node {
int x;
int y;
};
int bk1,bk2;
void bfs(int x,int y) {
queue<node>q;
node a;
a.x=x;
a.y=y;
q.push(a);
while(!q.empty()) {
node b;
b=q.front();
q.pop();
for(int i=0;i<4;i++) {
node c;
c.x=b.x+dx[i];
c.y=b.y+dy[i];
bk1=mp[b.x][b.y];
bk2=mp[c.x][c.y];
if(bk1!=bk2&&c.x>0&&c.y>0&&c.x<=n&&c.y<=n&&!bk[c.x][c.y]) {
ans++;
step[c.x][c.y]=step[b.x][b.y]+1;
bk[c.x][c.y]=1;
q.push(c);
}
}
}
}
int main() {
cin>>n>>m;
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) {
cin>>mp[i][j];
}
while(m--) {
cin>>sx>>sy;
ans=1;
memset(step,0,sizeof(step));
memset(bk,0,sizeof(bk));
bk[sx][sy]=1;
bfs(sx,sy);
cout<<ans<<endl;
}
}
后来实在没办法了,洛谷题解又都看不懂,就去看了一下dhz的博客,发现他的优化方式很独特啊:先把每种情况的答案全部存起来,dx和dy来对应每一个t,输入每一个sx和sy都有存好的答案放到了a数组中,这个思路真是tql 但是我刚开始打了一次发现还是错了 原因是我把用来辅助存答案和判断走没走过的数组bk设成了一个bool数组,到头来只存了一个答案,也因为这个题巧了,两个样例答案还都一样 一直没有发现哪里的问题
这图见证了了我的艰难的心路历程
#include<bits/stdc++.h>//bool数组的代码 wawawawa
using namespace std;
char mp[2000][2000];
bool bk[2000][2000];
int a[200000];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int sum;
int t=1;
int sx,sy;
struct node {
int x;
int y;
}b;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>mp[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(!bk[i][j]) {
queue<node>q;
b.x=i;
b.y=j;
q.push(b);
sum++;
bk[i][j]=t;
while(!q.empty()) {
b=q.front();
q.pop();
for(int k=0;k<4;k++) {
node d=b;
d.x=b.x+dx[k];
d.y=b.y+dy[k];
if(!bk[d.x][d.y]&&d.x<n&&d.x>=0&&d.y>=0&&d.y<n&&(mp[d.x][d.y]!=mp[b.x][b.y])) {
bk[d.x][d.y]=t;
sum++;
q.push(d);
}
}
}
a[t]=sum;
sum=0;
t++;
}
while(m--) {
cin>>sx>>sy;
cout<<a[bk[sx-1][sy-1]]<<endl;
}
}
最后附上ac代码 :
#include<bits/stdc++.h>
using namespace std;
char mp[2000][2000];
int bk[2000][2000];
int a[200000];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int sum;
int t=1;
int sx,sy;
struct node {
int x;
int y;
}b;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>mp[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(!bk[i][j]) {
queue<node>q;
b.x=i;
b.y=j;
q.push(b);
sum++;
bk[i][j]=t;
while(!q.empty()) {
b=q.front();
q.pop();
for(int k=0;k<4;k++) {
node d=b;
d.x=b.x+dx[k];
d.y=b.y+dy[k];
if(!bk[d.x][d.y]&&d.x<n&&d.x>=0&&d.y>=0&&d.y<n&&(mp[d.x][d.y]!=mp[b.x][b.y])) {
bk[d.x][d.y]=t;
sum++;
q.push(d);
}
}
}
a[t]=sum;
sum=0;
t++;
}
while(m--) {
cin>>sx>>sy;
cout<<a[bk[sx-1][sy-1]]<<endl;
}
}