做网站建设小程序,济南优化网站技术,营销型企业网站有哪些类型,多梦主题建设的网站正题 题目大意
一个n∗mn*mn∗m的雪地#xff0c;有两种动物RRR和FFF会在雪地上留下RRR和FFF的脚印(只可以走到相邻格子#xff0c;从(1,1)(1,1)(1,1)进入(n,m)(n,m)(n,m)出来#xff0c;且会覆盖掉原先的脚印)。
求至少有多少只动物经过 解题思路
首先我们知道(1,1)(1,1…正题 题目大意
一个n∗mn*mn∗m的雪地有两种动物RRR和FFF会在雪地上留下RRR和FFF的脚印(只可以走到相邻格子从(1,1)(1,1)(1,1)进入(n,m)(n,m)(n,m)出来且会覆盖掉原先的脚印)。
求至少有多少只动物经过 解题思路
首先我们知道(1,1)(1,1)(1,1)所在的联通块必定是最后一只经过的动物因为至少所以我们优先选择整个联通块作为最后一只动物。
然后由这个联通块开始向外扩展另一种脚印的联通块之后不停扩展直到扩完为止。 codecodecode
#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize(Ofast)
%:pragma GCC optimize(inline)
#includecstdio
#includecstring
#includealgorithm
#includeiostream
#includequeue
using namespace std;
const int N4001;
const int dx[4]{1,-1,0,0},dy[4]{0,0,1,-1};
int n,m,ans,v[N][N];
int qx[N*N],qy[N*N],l1,r;
char c[N][N],z;
queueint shix,shiy;
inline long long read()
{char c;int f0,d1;while(cgetchar(),!isdigit(c)) if(c-) d-1;f(f3)(f1)c-48;while(cgetchar(),isdigit(c)) f(f3)(f1)c-48;return d*f;
}
void bfs(int x,int y,char pos)
{shix.push(x);shiy.push(y);while(!shix.empty()){xshix.front();yshiy.front();shix.pop();shiy.pop();for(int k0;k4;k){int zxxdx[k],zyydy[k];if(zx1||zy1||zxn||zym)continue;if(v[zx][zy]||c[zx][zy]!pos)continue;v[zx][zy]1;shix.push(zx);shiy.push(zy);qx[r]zx;qy[r]zy;}}
}
int main()
{freopen(data.txt,r,stdin);nread();mread();for(int i1;in;i)gets(c[i]1);v[1][1]qx[r]qy[r]1;bfs(1,1,c[1][1]);zc[1][1];while(lr){ans;int Rr;if(zF) zR;else zF;for(int il;iR;i)bfs(qx[i],qy[i],z);lR1;}coutans;
}