分裂算法(SA)算法框架(自制)
主体结构为在一个长x,宽y的长方形中发射xy/2个SA,每个SA会增加total,并往原地放一个SAL,每个SAL会向四周扩散并把原地变成墙,直到没有空位置。
该框架适用于一本通1329.细胞、1249.Lake Counting等
也可以在SAL中加入元素“j”,即可适用于1252.走迷宫等
#include<bits/stdc++.h>
using namespace std;
int a[10001][10001]={0},i,j,total;
void sal(int x,int y){
if(x,y在边框内||a[x][y]=墙) return;
else a[x][y]=墙;
sal(x+1,y,i+1),sal(x,y+1,i+1),sal(x-1,y,i+1),sal(x,y-1,i+1);
}
void sa(int x,int y){
if(x,y在边框内||a[x][y]=='#') return;
total++;
sal(x,y,1);
}
int main(){
cin>>边框x>>边框y;
for(i=1;i<=边框x;i+2)
for(j=1;j<=边框y;j+2)
cin>>a[i][j];
for(i=1;i<=边框x;i+2)
for(j=1;j<=边框y;j+2)
sa(i,j);
cout<<total<<endl;
return 0;
}