题目

源地址:

http://poj.org/problem?id=3194

理解

本以为只要逐个判断每一个数是否有相邻即可,事实上,少考虑了一种情况。 比如下面给出的这种:

2211
1111
1111
1122

根据我原来的思路这种也是good,但其实并不是如此。当然,这个例子并不完备,但用于指出原来思路的漏洞已经够了。正确的思路应当是使用DFS来寻找是否存在独立的区块。

代码

#include <iostream>
#include <cstring>
using namespace std;
int N, ans;
int map[101][101];
int visit[101][101];

int step[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };

int color[101];
bool Check(int x, int y)
{
    if (x >= N || x < 0 || y >= N || y < 0)
        return false;
    return true;
}
void DFS(int CurX, int CurY)
{
    ans++;
    visit[CurX][CurY] = 1;
    color[map[CurX][CurY]] = 1;
    for (int i = 0; i < 4; i++)
    {
        int x = CurX+step[i][0];
        int y = CurY+step[i][1];
        if (Check(x, y) == false || visit[x][y] == 1)
            continue;
        if (map[CurX][CurY] == map[x][y] || color[map[x][y]] == 0)
        {
            DFS(x, y);
        }
    }
}
int main()
{
    while (cin>>N && N !=0)
    {
        int index = 1;
        ans = 0;
        memset(map, 0, sizeof(map));
        memset(visit, 0, sizeof(visit));
        memset(color, 0, sizeof(color));
        for (int i = 0; i < N-1; i++)
        {
            for (int j = 0; j < N; j++)
            {
                int a, b;
                cin>>a>>b;
                map[a-1][b-1] = index;
            }
            index++;
        }
        DFS(0, 0);
        if (ans == N*N)
            cout<<"good"<<endl;
        else
            cout<<"wrong"<<endl;
    }
    return 0;
}

更新日志

  • 2014年07月12日 已AC。