题意:
告诉n*m的图形,告诉起始点a,b以(a,b)为起点八个方向找联通块,求联通快周长。
思路:搜索来一层层找联通快,对于每个X,起始周长是4,如果X上下左右四个方向有X,那么周长就减一。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define maxn 15
#define MAXN 100005
#define mod 1000000007
#define INF 0x3f3f3f3f
#define exp 1e-6
#define pi acos(-1.0)
using namespace std;
int r,c,sum;
bool maps[21][21];
bool map1[21][21];
int dx[8]={0,0,-1,1,-1,1,-1,1};
int dy[8]={-1,1,0,0,1,-1,-1,1};
void go(int x,int y)
{
int i,j,k;
for( i=0;i<4;i++)
{
if(y+dy[i]<0||y+dy[i]>=c) sum++;
if(x+dx[i]<0||x+dx[i]>=r) sum++; //总共三种情况,边界处和非边界处,只需四个方向即可
if(y+dy[i]>=0&&y+dy[i]<c&&x+dx[i]>=0&&x+dx[i]<r&&!map1[x+dx[i]][y+dy[i]]) sum++;
}
for( k=0;k<8;k++)
{
if(x+dx[k]<r&&x+dx[k]>-1&&y+dy[k]<c&&y+dy[k]>-1&&maps[x+dx[k]][y+dy[k]])
{
maps[x+dx[k]][y+dy[k]]=0;
go(x+dx[k],y+dy[k]); //展开下层
}
}
}
int main()
{
//freopen("D://a.txt","r",stdin);
int i,j,x,y;
while(scanf("%d%d%d%d",&r,&c,&x,&y))
{
getchar(); //用getline时注意接收回车
if(r==0&&c==0&&x==0&&y==0)
break;
string s;
memset(map1,0,sizeof(map1));
memset(maps,0,sizeof(maps));
for(i=0;i<r;i++)
{
getline(cin,s);
for(j=0;j<c;j++)
if(s[j]=='X')
{maps[i][j]=1; map1[i][j]=1; //开两个数组,一个用来求周长,一个判断走没走过
}
}
sum=0; x--; y--; //注意此刻x y变化,因为数组从0开始
maps[x][y]=0;
go(x,y);
printf("%d\n",sum);
}
return 0;
}
心得::
别被题目吓住,其实题意非常简单!!!!!!!!!!!!!