题解:P12658 [KOI 2023 Round 1] 格子游戏
本人第一篇题解
### 大概思路大家可以去看liuhc123的思路,毕竟我个人感觉他的思路特别清晰
大概整理一下
判定为不能落脚的格子,同样性质的还有边界外的格子。 至于障碍格,聪明的你一定发现了,障碍格对我们的做法几乎没有影响
而且,重点格与红色格子的性质相同!也就是说可以一步到达该格的起始格子非常肯定是绿色的格子了
首先,处理好每个红色格子,把满足条件的格子涂成绿色。
然后,寻找那些没有被涂色的格子,这些格子无论怎么走下一步都会走到绿色的格子,我们把这些格子涂成红色。
最后,返回第一步,处理还没处理过的红格。同时我们记录涂色格子的数量,当所有格子都被上色后,结束涂色操作
接下来,就是你们最喜欢的题解了
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[500][500],tnt=1,q;
bool mapa[500][500];
void chuli_red(int x,int y)
{
if(!a[x-1][y]&&mapa[x-1][y]){
a[x-1][y]=1,tnt++;
}
if(!a[x][y-1]&&mapa[x][y-1]){
a[x][y-1]=1,tnt++;
}
for(int i=1;i<=k;i++){
if(x-i==0||y-i==0){
break;
}
if(!a[x-i][y-i]&&mapa[x-i][y-i]){
a[x-i][y-i]=1,tnt++;
}
}
}
bool pd(int x,int y){
if(a[x][y]){
return false;
}
if(!mapa[x][y]){
return false;
}
if(!a[x+1][y]&&mapa[x+1][y]){
return false;
}
if(!a[x][y+1]&&mapa[x][y+1]){
return false;
}
for(int i=1;i<=k;i++){
if(x+i>n||y+i>m){
break;
}
if(!a[i+x][y+i]&&mapa[x+i][y+i]){
return false;
}
}
return true;
}
int main(){
cin>>n>>m>>k;
memset(mapa,false,sizeof(mapa));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
char x;
cin>>x;
if(x=='.'){
mapa[i][j]=true;
}
else {
mapa[i][j]=false,a[i][j]=-1,tnt++;
}
}
a[n][m]=2;
chuli_red(n,m);
while(tnt<(n*m))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(pd(i,j))
{
tnt++;
a[i][j]=2;
chuli_red(i,j);
}
}
cin>>q;
for(int i=1;i<=q;i++)
{
int x,y;
cin>>x>>y;
if(a[x][y]==1){
cout<<"First"<<endl;
}
if(a[x][y]==2){
cout<<"Second"<<endl;
}
}
return 0;
}
希望你们可以认可我的极品代码
求过