uva 1103 Ancient Messages

来源:互联网 发布:大众软件多久一期 编辑:程序博客网 时间:2024/04/30 15:41

还是用dfs求连通块的内容

//观察可看出几张图中圈数不一样,可以根据此来识别每张图//先dfs整张图,填充颜色编号-----》将像素点为1的点的编号m存储起来-----》将环数存储进以m为下标的set中#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <set>#include <algorithm>using namespace std;const int maxn = 200 + 10;char bin[256][5], line[maxn];int H, W, pic[maxn][maxn], color[maxn][maxn];vector<set<int> > neighbor;const int dir_row[] = {-1, 1, 0, 0};const int dir_col[] = {0, 0, -1, 1};void dfs(int row, int col, int num) {    color[row][col] = num;    for(int i = 0; i < 4; i++) {        int row2 = row + dir_row[i];        int col2 = col + dir_col[i];        if(row2 >= 0 && row2 < H && col2 >= 0 && col2 < W && pic[row2][col2] == pic[row][col] && color[row2][col2] == 0)            dfs(row2, col2, num);    }}void decode(char c, int row, int col) {    for(int i = 0; i < 4; i++)        pic[row][col+i] = bin[c][i] - '0';}void check_neighbor(int r, int c) {    for(int i = 0; i < 4; i++) {        int r2 = r + dir_row[i];        int c2 = c + dir_row[i];        if(r2 >= 0 && r2 < H && c2 >= 0 && c2 < W && pic[r2][c2] == 0 && color[r2][c2] != 1)    //圈外的0的color是1            neighbor[color[r][c]].insert(color[r2][c2]);    }}const char *s = "WAKJSD";char recognize(int num) {    int c = neighbor[num].size();    return s[c];}int main(){    strcpy(bin['0'], "0000");    strcpy(bin['1'], "0001");    strcpy(bin['2'], "0010");    strcpy(bin['3'], "0011");    strcpy(bin['4'], "0100");    strcpy(bin['5'], "0101");    strcpy(bin['6'], "0110");    strcpy(bin['7'], "0111");    strcpy(bin['8'], "1000");    strcpy(bin['9'], "1001");    strcpy(bin['a'], "1010");    strcpy(bin['b'], "1011");    strcpy(bin['c'], "1100");    strcpy(bin['d'], "1101");    strcpy(bin['e'], "1110");    strcpy(bin['f'], "1111");    int kase = 0;    while(scanf("%d%d", &H, &W) == 2 && H && W) {        memset(pic, 0, sizeof(pic));        memset(color, 0, sizeof(color));        for(int i = 0; i < H; i++) {            scanf("%s", line);            for(int j = 0; j < W ;j++)                decode(line[j], i + 1, j * 4 + 1);  //将输入的数据解码到pic[i+1][j*4+1],注意行列是从下标1开始        }        H += 5;     //按理说加一就行,为什么 H += 1 会WA? 换成 H += 2 刚好可以AC ???????????????????        W = W * 4 + 5;  //因为原来的输入是16进制,转化为10进制后每个原来的16进制代表4个数字        int cnt = 0;        vector<int> vec;        for(int i = 0; i < H; i++)        for(int j = 0; j < W; j++) {            if(!color[i][j]) {                dfs(i, j, ++cnt);                if(pic[i][j] == 1)  vec.push_back(cnt);     //把图像中等于1的像素点的color编号都存储进vec容器            }        }        neighbor.clear();                   //neighbor用来存储环内的点        neighbor.resize(cnt + 5);   //其实相当于对每个成员初始化,去掉会引起RE,关于resize很容易用错,最好查下API文档        for(int i = 0; i < H; i++)        for(int j = 0; j < W; j++)            if(pic[i][j] == 1)  check_neighbor(i, j);   //将像素点为1周围的空环编号存储进neighbor容器里面        vector<char> ans;   //存储结果        for(int i = 0; i < vec.size(); i++)            ans.push_back(recognize(vec[i]));        sort(ans.begin(), ans.end());//对结果进行整理排序        printf("Case %d: ", ++kase);        for(int j = 0; j < ans.size(); j++)            printf("%c", ans[j]);        printf("\n");    }    return 0;}

代码中有个地方不明白,写在备注中了。最后附上网上搜的测试数据

6 2007c447c30006 250000000000000000000000000000000000000000000000000000001fe0000000000007c000000003fe0000000000007c00000000000000000000000000000000000000000000000000000010 30007785487485787000007f01e000016 2007e427e427e427e427e427e00004a0016 10123456789abcdef9 2007e427e427e427e0043 2007e007e427e427e427e007e427e007e427e427e007e427e427e427e427e007e427e427e427e427e427e00200 500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000100 2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f800000000000000000000001fe00000000000000000000007ff00000000000000000000007ff8000000000000000000000f8f8000000000000000000001f07c000000000000000000001e03c000000000018000000001e01c00000000003c000000001c01c00000000007c000000003c01e0000000000f8000000003c01e0000000001f0000000001c01c0000000003f0000000001c01c0000000007e0000000001e01c000000000fc0000000001e03c000000001fc0000000000e03c000000001fc0000000000f038000000003ff0000000000f078000000003ff80000000007870000000007ff800000000038f0000000007cfc0000000003ce0000000007c7c0000000781fc0f0000000f87c00000007ffffff0000000f07c00000007ffffff0000000f07c00000007ffffff0000001f07c00000007ffffff0000000e03e00000007fcf81f0000000603e0000000000f8000000000003e0000000000f8000000000003e0000000000f8000000000003e0000000000f8000000000001e0000000000f8000000000001f0000000000fc000000000001f0000000000fc000000000001f0000000000fc000000000001f0000000000fc000000000000f0000000001fc000000000000f8000000001fc000000000000f8000000001fc000000000000f8000000001fc000000000000f8000000001fe000000000000f8000000001fe00000000000078000000001fe0000000000007c000000001fe0000000000007c000000003fe0000000000007c000000003fe0000000000007c000000003fe0000000000007c000000003fe0000c00000003c000000000000003ff0000003c000000000000007ff8000003e00000000000001fffc000003e00000000000003e03f000003e00000000000007c00f000003e0000000000000f0003800003f0000000000000e0001c00003fc000000000001c0001e00007fe000000000003c0000e0000fff000000000073c000070000fdf0000000001ff8000070001f0f8000000001ff8000070001e078000000003cf0000078001e038000000003870000033001e03800000000307800003fc01e03800000000703800007fe00e03800000000703800007ce00e03800000000703c000078700703800000000701e0000f0700701000000000701e0000e0700300000000000700f0001c07000000000000006007800380600000000000000e003e00700600000000000000e001fe7e00600000000000000e000fffc00e00000000000000e0000ff000e00000000000000f800038000e00000000000000fff0000000e00000000000000fffff00000e0000000000000003ffffe000c000000000000000007ffffc0c00000000000000000007ffffc000000000000000000000fffc00000000000000000000001fc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000150 3800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000f80000000001fff00000000780000000000001fe0000000007fff80000000ff0000000000007ff000000000ffffe0000001ff8000000000007ff800000003fffff0000001fffc0000000000f8f800000007fffffc000001fffe0000000001f07c0000000ffffffe000000ffff0000000001e03c0000001fffffff000000ffff8000000001e01c0000003fffffff0000007fffc000000001c01c0000003fffffff8000007fefc000000003c01e0000007fffffffc000003f83c000000003c01e000000ffffffffc000001f81e000000001c01c000000fffc0fffe000001f01e000000001c01c000001fff003ffe000000f01e000000001e01c000001ffe001fff000000f00e000000001e03c000003ffc0007ff000001e00f000000000e03c000003ff80007ff800001e00f000000000f038000007ff80003ff800001e00f000000000f078000007ff00003ff800001e00f0000000007870000007ff00001ffc00000e00e00000000038f000000fff00001ffc00000e00e0000000003ce000000ffe00000ffc00000e00e0000000781fc0f0000ffe00000ffc00000f00e00000007ffffff0000ffc00000ffc00000f01e00000007ffffff0000ffc00000ffc00000f01e00000007ffffff0000ffc00000ffc00000701c00000007ffffff0000ffc00000ffc00000781c00000007fcf81f0000ffc000007fc00000783c0000000000f8000000ffc000007fc0000038380000000000f8000000ffc000007fc000003c780000000000f8000000ffc000007fc000001c780000000000f8000000ffc000007fc000001e700000000000f8000000ffc000007fc000200ef00800000000fc000000ffc00000ffc0003f8fe3f800000000fc000000ffc00000ffc0003ffffff800000000fc000000ffc00000ffc0003ffffff800000000fc000000ffc00000ffc0003ffffff800000001fc000000ffc00000ffc0003ffffff800000001fc0000007fe00000ff80003ffffff800000001fc0000007fe00000ff80003fffdff800000001fc0000007fe00000ff80003c03c00000000001fe0000007ff00001ff80000007c00000000001fe0000003ff00001ff00000007c00000000001fe0000003ff00001ff00000007c00000000001fe0000001ff80003ff00000007c00000000003fe0000001ff80003fe00000007c00000000003fe0000001ff80003fe00000007c00000000003fe0000000ffc0007fe00000007c00000000003fe0000000ffc0007fc00000007c000000000000000000007fe0007fc00000007c000000000000000000007fe000ff800000007c000000000000000000007ff001ff800000007c000000000000000000003ff001ff800000007c000000000000000000001ff803ff000000007c002000000000000000001ff803ff000000007c006000000000000000000ffc07fe000000007c006000000000000000000ffc0ffc000000007c00c000000000000000000ffe0ffc000000003e01c0000000000000000007ff0ff8000000003f03c0000000000000000003ff1ff0000000003f8f80000000000003c00001ffbff00000f0001fff80000000000003ffc001ffffe0007ff0000fff80000000000003fffff1ffffe3fffff00007ff80000000000003fffffffffffffffff00001ff00000000000003fffffffffffffffff00000ff00000000000003fffffffffffffffff000007f00000000000003fffffffffffffffff000001e00000000000003fffffffffffffffff000000e00000000000003fffffffffffffffff000000200000000000003fffffffffffffffff000000000000000000003fffffffffffffffff000000000000000000003fffffffffffffffff000000000000000000003fffffffffffffffff000000000000000000003fffffffffffffffff000000000000000000003fffffffffffffffff000000000000000000003fffffc1ffe0007fff000000000000000000003ff80000ffe000000f0000000000000000000038000000ffe00000000000000000000000000000000001fff00000000000000000000000000000000001fff00000000000000000000000000000000001fff00000000000000000000000000000000001fff00000000000000000000000000000000001fff00000000000000000000000000000000001fff00000000000000000000000000000000003fff00000000000000000000000000000000003fff00000000000000000000000000000000003fff0000000fc000000000000000000fe000003fff8000003ff000000000000000003ffc00003fff8000007ffc0000000000000000fffe00003fff800000fcfc0000000000000001f01f00003fff800001f03e0000000000000003e00f80003fff800003e01f0000000000000003e00780003fff800003e00f0000000000000003e00780003fff800003c00f0000000000000003e00f80003fff800003c00f0000000000000001f00f00007fff800003c00f0000000000000000f81e00007fffc00003e00f00000000000000007c3c00007fffc00001e01e00000000000000003e7800007fffc00000f01e00000000000000fffffffe007fffc00000f03c00000000000000fffffffe007fffc00000787800000000000000fffffffe007fffc000003cf0000000000000000007c000007fffe000f81fe07c0000000000000007e000007fffe000fffffffc0000000000000007e000007fffe000fffffffc000000000000000fe000007fffe000fffffffc000000000000000ff00000ffffe000ffc7c0fc000000000000000ff00000ffffe0000007c000000000000000001ff00000ffffe000000fc000000000000000001ff00000ffffe000000fc000000000000000001ff80000ffffe000000fc000000000000000001ff80000ffffe000000fc000000000000000003ff80001ffffe000000fe000000000000000003ff80001ffffe000000fe0000000000000000000000001fffff000001fe0000000000000000000000001fffff000001fe0000000000000000000000001fffff000001fe0000000000000000000000001fffff000001ff0000000000000000000000001fffff000001ff0000000000000000000000001fffff000001ff0000000000000000000000001fffff000003ff0000000000000000000000001fffff000003ff0000000000000000000000001fffff000003ff0000000000000000000000001fffff800000000000000000000000000000003fffff800000000000000000000000000000003fffff800000000000000000000000000000003fffff800000000000000000000000000000003fffff800000000000000000000000000000003fffff800000000000000000000000000000003fffff800000000000000000000000000000003fffff800000000000000000000000000000003fffffc00000000000000000000000000000003fffffc00000000000000000000000000000007fffffc00000000000000000000000000000007fffffc00000000000000000000000000000007fffffc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0

0 0
原创粉丝点击