UVA1103分区涂色+vc使用注意事项

这道题目没有什么好说的,就是将不同区域涂成不同的颜色,特别要注意的是vis中一定不能使用0,

map的添加元素问题,尤其是map的第二个元素是一个set的时候,必须先创建一个set,然后再添加到map中去,不能直接添加。

另外,不必过于担心栈溢出的情况,尤其是数据小的时候不溢出,数据大了的时候溢出的情况。

下面再来说说vc6.0的使用注意事项,虽然我也不想用这个玩意,但是复试的时候指定使用这个玩意,我也没有办法啊

第一点就是:在for(int i)的时候,如果前面使用过i那么在下一次定义一个for的时候,不能再使用i,而在vs中,不同的for循环中的i是可以一样的

解决方式就是变成i_1,i_2这种形式

第二点就是,在使用STL(map,set等)的时候,需要使用std::。而且如果要想要使用第二个元素为set的map的时候,必须使用一下typedef,然后才能在map中使用。

还有一点就是如果vc发生了栈溢出,那么有可能再次编译的时候会发生错误,这个时候应该迅速的创建一个新的工程。

下面贴上在vc上编译通过,并且已经ac的代码

//这题重新做一遍,使用刘汝佳的方式
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<set>
#include<map>
#include<algorithm>
#include<vector>
using namespace std;

const int maxn = 200+5;

char G[maxn][maxn];
char vis[maxn][maxn];

int num_row,num_col;
int Row,Col;
int cnt = 1;

int read_char()
{
    int x;
    for(;;)
    {
        x = getchar();
        if(x == '\n'||x=='\r')
            continue;
        if(isalpha(x))
            return x - 'a' + 10;
        else return x - '0';
    }
}
void print_G()
{
    for(int i = 0;i < Row;i++)
    {
        for(int j = 0;j < Col;j++)
        {
            printf("%d",G[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
void print_vis()
{
    for(int i = 0;i < Row;i++)
    {
        for(int j = 0;j < Col;j++)
        {
            printf("%d",vis[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int dr[] = {-1,0,1,0};
int dc[] = {0,1,0,-1}; 

bool is_in_G(int r,int c)
{
    if(r >= 0 && r < Row && c >= 0 && c< Col)
        return true;
    return false;
}

void DFS(int r,int c)
{
    vis[r][c] = cnt;
    for(int i = 0; i < 4;i++)
    {
        int row = r + dr[i];
        int col = c + dc[i];
        if(is_in_G(row,col) && !vis[row][col] && G[row][col] == G[r][c])//相等的才会去遍历
        {
            DFS(row,col);
        }
    }
    
}


int main()
{
#ifdef local
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
#endif
    int kase = 0;
    while(scanf("%d%d",&num_row,&num_col) == 2 && num_row)
    {
        cnt = 1;
        printf("Case %d: ",++kase);
        memset(G,0,sizeof(G));
        memset(vis,0,sizeof(vis));
        for(int i_1 = 1;i_1 <= num_row;i_1++)
        {
            for(int j_1 = 1;j_1 <= num_col;j_1++)
            {
                int x = read_char();
                int pos = 4;
                while(pos)
                {
                    G[i_1][4 * j_1 + pos - 4] = x % 2;
                    x = x / 2;
                    pos--;
                }
            }
        }

    Row = num_row +2;
    Col = 4 * num_col + 2;
//print_G();
    for(int i_2 = 0; i_2 < Row;i_2++)
    {
        for(int j_2 = 0;j_2 < Col;j_2++)
        {
            if(!vis[i_2][j_2])
            {
                DFS(i_2,j_2);
                cnt++;
            }
        }
    }
//print_vis();
    //遍历完的时候,不同区域是不同的颜色,边界上都是0
    typedef std::set<int> Set;
    std::map<int,Set>MAP;//保存边界的int,以及其对应的非0的颜色
    for(int i_3 = 0;i_3 < Row;i_3++)
    {
        for(int j_3 = 0;j_3 < Col;j_3++)
        {
            if(G[i_3][j_3])
            {
                if(!MAP.count(vis[i_3][j_3]))
                {
                    set<int>SET;
                    MAP[vis[i_3][j_3]] = SET;
                }
                int row,col;
                for(int pos = 0;pos < 4; pos++)
                {
                    row = i_3 + dr[pos];
                    col = j_3 + dc[pos];
                    if(!G[row][col]&&vis[row][col]!=1)//不是背景色也不是边界
                    {
                        MAP[vis[i_3][j_3]].insert(vis[row][col]);
                    }
                }
            }
        }
    }
    vector<char>V;
    char *convert = "WAKJSD";
    for(std::map<int,Set>::iterator it = MAP.begin();it!=MAP.end();it++)
    {
        V.push_back(convert[it->second.size()]);
    }
    sort(V.begin(),V.end());
    for(int i_4 = 0;i_4 < V.size();i_4++)
    {
        printf("%c",V[i_4]);
    }
    printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/TorettoRui/p/10452198.html