dfs 先找出死亡的人所在海域 然后 从外侧把不属于这个海域的部分去掉 然后就开始dfs 寻找 有几个岛屿 以后还要好好努力
做题 太死板
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> bool vis[510][510]; int map[510][510]; int n,m,x,y; int move1[4][2]= {{0,1},{0,-1},{1,0},{-1,0}}; int move2[8][2]= {{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,1},{1,-1},{-1,-1}}; void dfsb(int a, int b) { if(map[a][b]==1) return ; if(map[a][b]==2) return ; if(map[a][b]==0) return ; if(map[a][b]==3) map[a][b]=1; for(int i=0; i<8; i++) { int nx=a+move2[i][0]; int ny=b+move2[i][1]; dfsb(nx,ny); } } void dfsn(int a, int b) { if(map[a][b]==1) return ; if(!map[a][b]) return; map[a][b]=0; for(int i=0; i<4; i++) { int nx=move1[i][0]+a; int ny=move2[i][1]+b; dfsn(nx, ny); } } void dfs(int a, int b) { if(map[a][b]==1) return; if(map[a][b]==0) return; if(map[a][b]==3) return; map[a][b]=1; for(int i=0; i<4; i++) { int nx=move1[i][0]+a; int ny=move2[i][1]+b; dfs(nx, ny); } } int main() { // freopen("s.txt","r",stdin); while(scanf("%d %d %d %d",&m,&n,&y,&x)==4) { char ch; memset(map, 0, sizeof(map)); getchar(); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { scanf("%c",&ch); if(ch=='#') map[i][j]=2; else if(ch=='.') map[i][j]=3; } getchar(); } dfsb(x,y); for(int i=1; i<=n; i++) dfsn(i,1),dfsn(i,m); for(int i=1; i<=m; i++) dfsn(1,i),dfsn(n,i); int ans=0; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(map[i][j]==2) { ans++; dfs(i,j); } } } printf("%d\n",ans); } return 0; }
浙公网安备 33010602011771号