HDU1198 DFS

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string>
#include<algorithm>
#include<sstream>
#include<set>
#include<map>
#include<cctype>
#include<vector>
#include<math.h>
#include<memory>
using namespace std;
char grid[101][101];
int visited[101][101];
int m, n;
int d1[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
int d[11][4] = { { 0, 0, 1, 1 }, { 1, 0, 0, 1 }, { 0, 1, 1, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 1 }, { 1, 0, 1, 0 },
{ 1, 0, 1, 1 }, { 0, 1, 1, 1 }, { 1, 1, 1, 0 }, { 1, 1, 0, 1 }, { 1, 1, 1, 1 } };
void dfs(int x, int y, int id)
{
    visited[x][y] = 1;
    int xx, yy, k;
    for (int i = 0; i < 4; i++)
    {
        if (d[id][i])
        {
            xx = x + d1[i][0];
            yy = y + d1[i][1];
            k = grid[xx][yy] - 'A';
            if (xx >= 0 && xx < m && yy >= 0 && yy < n 
                && !visited[xx][yy] && d[k][(i + 2) % 4])//当前方格如果右边有接口,则判断右边的方格的左边的边是不是有接口
                dfs(xx, yy, k);
        }
    }
}
int main()
{
    int i, j,sum;
    while (scanf("%d%d", &m, &n) != EOF && m != -1)
    {
        sum = 0;
        memset(visited, 0, sizeof(visited));
        for (i = 0; i < m; i++)
        {
            scanf("%s", grid[i]);
        }
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < n; j++)
            {
                if (!visited[i][j])
                {
                    dfs(i, j, grid[i][j] - 'A');
                    sum++;
                }
            }
        }
        printf("%d\n", sum);
    }
    return 0;
}

 

posted @ 2016-10-04 16:08  web之路  阅读(62)  评论(0)    收藏  举报