题意:在一个n行m列的办公室中有一些小的矩形桌子,每个人的桌子都有唯一的颜色与之对应,总统的副手与总统桌子相邻,给出一个图,c代表总统桌子颜色,求总统有多少个副手。
思路:从总统的桌子开始找,相邻的桌子,并将其去掉,没去掉一次人数加一次,写一个去掉桌子的函数。
#include<iostream> using namespace std; const int maxx = 101; char map[maxx][maxx]; char c; int num,n,m; int cal[5] = {1,0,-1,0,1}; void clear(int x,int y); void dfs(int x,int y) { if(map[x][y]==c) { for(int i=0;i<4;i++)// x+1,y x,y+1 x-1,y x,y-1 { int x1=x+cal[i],y1=y-cal[i+1]; if(map[x1][y1]!='.'&&x1>=0&&x1<n&&y1>=0&&y1<m) { map[x][y]='.'; dfs(x1,y1); } } } else if(map[x][y]!='.') { clear(x,y); num++; } } void clear(int x,int y) { char b = map[x][y]; map[x][y]='.'; for(int i=0;i<4;i++) { int x1=x+cal[i],y1=y-cal[i+1]; if(map[x1][y1]==b&&x1>=0&&x1<n&&y1>=0&&y1<m) { clear(x1,y1); } } } int main() { int x,y; while(cin>>n>>m) { cin>>c; num=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>map[i][j]; } for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(map[i][j]==c) { x=i; y=j; break; } } dfs(x,y); cout<<num<<endl; } }