[POJ]1970 The Game (DFS搜八连通的连通块)

来源:互联网 发布:淘宝网夏季中年女装 编辑:程序博客网 时间:2024/06/04 08:23

题目链接:http://poj.org/problem?id=1970


题目大意:给定一个19*19的五子棋盘,(1和2表示两种棋子,0表示空位置),判定当前1和2哪个获胜,并输出5子连通的最左最上的位置坐标

数据范围:19*19棋盘

题目解答:DFS搜八连通的连通块(复杂度:O(极限情况是19*19*19))

注意:1.必须严格的5子连通,多于5子连通的不算赢,因此判出5子连通之后还需要特判,前一个棋子子是否与当前位置的棋子相同

          2.由于要找最左最上的位置,所以每个棋子只需要判断“右上”、“右”、“右下”、“下”,四个方向

#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <iostream>#include <algorithm>using namespace std;const int maxn = 30;int g[maxn][maxn];int dx[] = {1, 0, 1, -1};int dy[] = {0, 1, 1, 1};int c;inline bool check(int x, int y){    return x >= 0 && x < 19 & y >= 0 & y < 19;}int dfs(int x, int y, int d){    int sum = 1, xx, yy;    xx = x+dx[d];    yy = y+dy[d];    if(check(xx, yy) && g[xx][yy] == c)    {        sum += dfs(xx, yy, d);    }    return sum;}int main(){    int t;    scanf("%d", &t);    while(t--)    {        for(int i = 0; i < 19; ++i)        {            for(int j = 0; j < 19; ++j)            {                scanf("%d", &g[i][j]);            }        }        int ans;        int flag = 0;        int x, y;        for(int i = 0; i < 19 && !flag; ++i)        {            for(int j = 0; j < 19 && !flag; ++j)            {                if(!g[i][j]) continue;                if(g[i][j] == 1 && !flag)                {                    c = 1;                    for(int k = 0; k < 4 && !flag; ++k)                    {                        ans = dfs(i, j, k);                        int xx = i-dx[k];                        int yy = j-dy[k];                        if(ans == 5 && (!check(xx, yy) || g[xx][yy] != c))                        {                            x = i, y = j;                            flag = 1;                        }                    }                }                if(g[i][j] == 2 && !flag)                {                    c = 2;                    for(int k = 0; k < 4 && !flag; ++k)                    {                        ans = dfs(i, j, k);                        int xx = i-dx[k];                        int yy = j-dy[k];                        if(ans == 5 && (!check(xx, yy) || g[xx][yy] != c))                        {                            x = i, y = j;                            flag = 2;                        }                    }                }            }        }        printf("%d\n", flag);        if(flag)printf("%d %d\n", x+1, y+1);    }    return 0;}















0 0