POJ 1111 Image Perimeters(dfs)

来源:互联网 发布:android涂鸦源码 编辑:程序博客网 时间:2024/05/20 03:42

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 30char 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;}
0 0