Description
先输入一个矩阵,再输入一个X的位置,然后输出与这个X在八个方向能够连起来的所有X组成的图形的周长
Input
多组用例。每组用例的第一行为四个整数row,col,x,y(所有数据均在1-20范围内),分别表示矩阵的行数,列数,查询点的横坐标和纵坐标,接下来为一个由‘.’和‘X’组成的矩阵,以0 0 0 0结束输入
Output
对于每组用例,输出查询点在八个方向上能够连起来的所有X组成的图形的周长
Sample Input
2 2 2 2
XX
XX
6 4 2 3
.XXX
.XXX
.XXX
…X
..X.
X…
5 6 1 3
.XXXX.
X….X
..XX.X
.X…X
..XXX.
7 7 2 6
XXXXXXX
XX…XX
X..X..X
X..X…
X..X..X
X…..X
XXXXXXX
7 7 4 4
XXXXXXX
XX…XX
X..X..X
X..X…
X..X..X
X…..X
XXXXXXX
0 0 0 0
Sample Output
8
18
40
48
8
Solution
光棍节之题……
简单dfs,从查询点开始往八个方向搜索,不是‘X’就标记成‘#’,这样的话当搜索到‘X’时只需计算这个‘X’上下左右四个方向的‘.’的个数叠加即为周长
Code
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 30
char map[maxn][maxn];
int row,col,r,c;
int d[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
int dfs(int r,int c)
{
if(map[r][c]=='.'||map[r][c]=='#')//不是X,返回0
return 0;
map[r][c]='#';//不是X就标记成#
int sum=0;
for(int i=0;i<4;i++)//四个方向计算'.'的个数
sum+=(map[r+d[i][0]][c+d[i][1]]=='.');
for(int i=0;i<8;i++)//八个方向搜索
sum+=dfs(r+d[i][0],c+d[i][1]);
return sum;//返回sum值
}
int main()
{
while(scanf("%d%d%d%d",&row,&col,&r,&c),row)
{
memset(map,'.',sizeof(map));//初始化
for(int i=1;i<=row;i++)
for(int j=1;j<=col;j++)
cin>>map[i][j];
printf("%d\n",dfs(r,c));
}
return 0;
}