先说下题意:
给你个地图 里面有a-z的颜色泡 为你一个点 若与这个点连着的颜色相同超过3个 则会爆炸 之后没有雨最顶端相连(间接相连也行)的也会爆炸 给你个坐标 问你会爆炸多少个 先深搜(或广搜)找到多少个 会爆炸 大于三个在对第一行的所有点进行广搜找到所有相连的点 用总的减去就行
做了这道题明白一个道理 题目的图不是没用的,, 为此还贡献了几次wa 这道题做起来比较容易 就是得先搞清楚球是交叉排的 这就涉及到一个是否连着的问题 对基数行和偶数行是不一样的, 所以方向数组是不一样的 ,, 这道题的具体做法有很多 广搜深搜都行 这里就不多说了
#include<stdio.h> #include<string.h> #include<iostream> #include<queue> using namespace std; int n,m; char map[110][110],p; int dirou[6][2]={0,1,0,-1,1,0,-1,0,1,-1,-1,-1}; int dirji[6][2]={0,1,0,-1,1,0,-1,0,-1,1,1,1}; int sum,mark[110][110]; struct node { int x,y; }a,b,leap[10010]; int dfs(int x,int y) { int xx,yy; for(int i=0;i<6;i++) { if(x%2==0) { xx=x+dirou[i][0]; yy=y+dirou[i][1]; if(xx<0||xx>=n||yy<0) continue; if(xx%2==0&&yy>=m) continue; if(xx%2!=0&&yy>=m-1) continue; } else { xx=x+dirji[i][0]; yy=y+dirji[i][1]; if(xx<0||xx>=n||yy<0) continue; if(xx%2==0&&yy>=m) continue; if(xx%2!=0&&yy>=m-1) continue; } if(map[xx][yy]!=p) continue; if(mark[xx][yy]==0) { sum++; mark[xx][yy]=1; leap[sum].x=xx; leap[sum].y=yy; dfs(xx,yy); } } return 0; } int bfs(int starx,int stary) { a.x=starx; a.y=stary; queue<node>q; int t=1; mark[a.x][a.y]=1; q.push(a); while(!q.empty()) { b=q.front(); q.pop(); for(int i=0;i<6;i++) { if(b.x%2==0) { a.x=b.x+dirou[i][0]; a.y=b.y+dirou[i][1]; if(a.x<0||a.x>=n||a.y<0) continue; if(a.x%2==0&&a.y>=m) continue; if(a.x%2!=0&&a.y>=m-1) continue; } else { a.x=b.x+dirji[i][0]; a.y=b.y+dirji[i][1]; if(a.x<0||a.x>=n||a.y<0) continue; if(a.x%2==0&&a.y>=m) continue; if(a.x%2!=0&&a.y>=m-1) continue; } if(mark[a.x][a.y]) continue; if(map[a.x][a.y]>=‘a‘&&map[a.x][a.y]<=‘z‘) { mark[a.x][a.y]=1; t++; //printf("****\n"); q.push(a); } } } return t; } int main() { int i,j,starx,stary; while(~scanf("%d%d%d%d",&n,&m,&starx,&stary)) { for(i=0;i<n;i++) scanf("%s",map[i]); starx--; stary--; sum=1; leap[sum].x=starx; leap[sum].y=stary; p=map[starx][stary]; memset(mark,0,sizeof(mark)); mark[starx][stary]=1; dfs(starx,stary); if(sum<3) printf("0\n"); else { //printf("%d^^^^^\n",sum); for(i=1;i<=sum;i++) map[leap[i].x][leap[i].y]=‘E‘; int num=0; for(i=0;i<n;i++) { int k=(i%2==0?m:m-1); for(j=0;j<k;j++) if(map[i][j]>=‘a‘&&map[i][j]<=‘z‘) num++; } memset(mark,0,sizeof(mark)); int kk=0; for(j=0;j<m;j++) { if(mark[0][j]==1) continue; if(map[0][j]==‘E‘) continue; kk+=bfs(0,j); } printf("%d\n",sum+num-kk); } } return 0; }
时间: 2024-11-10 13:01:26