1. 程式人生 > >UVA- Ancient Messages 1103(dfs)

UVA- Ancient Messages 1103(dfs)

題意:有6種象形符號,給出一個矩陣,字元為16進位制形式,轉化為2進位制後1代表黑點,0代表白點,按照字典序輸出所以符號。

思路:觀察這6種符號,可以看出每種符號所包裹的白色的洞是不同的,所以我們根據白洞的數目來區別字元。首先,把矩陣轉化為2進位制,我們需要把矩陣增加一層全為白色畫素點的外殼,這是為了我們對(0,0)這個點深搜1次就可以把所以的不被黑色畫素點包圍即白洞之外的所有白色畫素點給標記出來,我們把這些點標記為-1,意思是不可訪問了,然後列舉所有黑色畫素點,對每一個黑色畫素點深搜,如果遇到白色的點,說明有一個白洞,然後對這個白色的點深搜,把白洞內所有的點標記為-1,每列舉一個黑色畫素點,根據白洞的個數判符號種類。

#include <cstdio>
#include <cstring>

const int maxn = 250;
int mp[maxn][maxn],num[6];
char bin[maxn][5],f[6] = {'A', 'D', 'J', 'K', 'S', 'W'};
int h,w,cnt;

bool read()
{
    scanf("%d%d",&h,&w);
    if(h == 0 && w == 0){
        return false;
    }
    memset(mp,0,sizeof(mp));
    memset(num,0,sizeof(num));
    for(int i = 1; i <= h; i++){
        getchar();
        int pos = 1;
        for(int j = 1; j <= w; j++){
            char c = getchar();
            for(int k = 0; k <= 3; k++){
                mp[i][pos++] = bin[c][k] - '0';
            }
        }
    }
    w = w * 4 + 1;
    h++;
}
void dfs1(int x,int y)
{
    if(x < 0 || y < 0 || x > h || y > w || mp[x][y] != 0){
        return;
    }
    mp[x][y] = -1;
    dfs1(x - 1,y);
    dfs1(x + 1,y);
    dfs1(x,y + 1);
    dfs1(x,y - 1);
}
void dfs2(int x,int y)
{
    if(x < 0 || y < 0 || x > h || y > w || mp[x][y] == -1){
        return;
    }
    if(mp[x][y] == 0){
        cnt++;
        dfs1(x,y);
        return;
    }
    mp[x][y] = -1;
    dfs2(x - 1,y);
    dfs2(x + 1,y);
    dfs2(x,y + 1);
    dfs2(x,y - 1);
}
int main(void)
{
    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 Case = 0;
    while(read()){

        dfs1(0,0);
        for(int i = 0; i < h; i++){
            for(int j = 0; j < w; j++){
                if(mp[i][j] == 1){
                    cnt = 0;
                    dfs2(i,j);
                    if(cnt == 1){
                        num[0]++;
                    }
                    else if(cnt == 3){
                        num[2]++;
                    }
                    else if(cnt == 5){
                        num[1]++;
                    }
                    else if(cnt == 4){
                        num[4]++;
                    }
                    else if(cnt == 0){
                        num[5]++;
                    }
                    else{
                        num[3]++;
                    }
                }
            }
        }
        printf("Case %d: ",++Case);
        for(int i = 0; i <= 5; i++){
            while(num[i]){
                printf("%c",f[i]);
                num[i]--;
            }
        }
        printf("\n");
    }
    return 0;
}

相關推薦

UVA- Ancient Messages 1103dfs

題意:有6種象形符號,給出一個矩陣,字元為16進位制形式,轉化為2進位制後1代表黑點,0代表白點,按照字典序輸出所以符號。思路:觀察這6種符號,可以看出每種符號所包裹的白色的洞是不同的,所以我們根據白洞的數目來區別字元。首先,把矩陣轉化為2進位制,我們需要把矩陣增加一層全為白

UVa】208 Firetruckdfs

-m main truck 開始 clear %d span 需要 from 題目 題目 ? ? 分析 一開始不信lrj的話,沒判聯通,果然T了。 沒必要全部跑一遍判,只需要判斷一下有沒有點與n聯通,鄰接表不太好判,但無向圖可以轉換成去判n與什麽聯通。 關於為什麽要判,還

UVa】439 Knight Movesdfs

scan sca return true false stdout 沒有 nss logs 題目 題目 ? ? 分析 沒有估價函數的IDA。。。。。。 ? ? 代碼 #include <cstdio> #include <cstring> #in

UVa】Biggest Numberdfs+剪枝

scanf sin ret break puts 從大到小 如果 ssl ges 題目 題目 ? ? 分析 典型搜索,考慮剪枝。 統計一下聯通分量。 1、本位置能夠達到所有的點的數量加上本已有的點,還沒有之前的結果長,直接返回。 2、當本位置能夠達到所有的點的數量加上本

UVA 572 -- Oil DepositsDFS求連通塊+種子填充算法

string pos .net 連通塊 dep tpi zhong deposit amp UVA 572 -- Oil Deposits(DFS求連通塊)   圖也有DFS和BFS遍歷,由於DFS更好寫,所以一般用DFS尋找連通塊。   下述代碼用一個二重循環來找到當前

UVa 817:According to BartjensDFS

題目連結   https://vjudge.net/problem/UVA-817 題意:輸入一個以等號結尾。前面只包含數字的表示式,插入一些加號、減號和乘號,使得運算結果等於2000.表示式裡的整數不能有前導零(例如,0100和000都是非法的),運算子都是二元的

UVA 10054 The Necklace dfs歐拉回路

題目連結:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18806   題意:給一些兩色(兩色可相同)的珠子,珠子相連的規則是相鄰珠子接觸部分的顏色相同,求這樣的珠子的排列順序並輸出。  

UVA 10318 Security PanelDFS剪枝 + 狀壓 + 思維題解

mat 題意 我們 %s 初始 max 地方 ont change 題意:給一個r*c的矩陣開關(初始全打開的),每次按下一個開關都會改變3*3範圍內的有*的地方的狀態,問你最少幾步能讓開關全閉上,按升序輸出按哪些按鈕 思路:每個按鈕至多按一下,按按鈕的順序和結果無關。我

UVA - 12113 Overlapping Squaresdfs+回溯

容易 ans pair ets ems clu turn esp con 題目: 給定一個4*4的棋盤和棋盤上所呈現出來的紙張邊緣,問用不超過6張2*2的紙能否擺出這樣的形狀。 思路: dfs紙的張數,每一張中枚舉這張紙左上角這個點的位置,暴力解題就可以了。 這個題的覆蓋太

1103 Integer Factorization DFS

text sample number and form separate ups power ges The K?P factorization of a positive integer N is to write N as the sum of the P-th pow

[ACM] POJ 3740 Easy Finding DFS

cas oss miss 矩陣 org fin contest std size Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16202 Accepted: 4349

ECNU 3260 袋鼠媽媽找孩子dfs

highlight 另一個 () class div names 中一 ble problem 鏈接:http://acm.ecnu.edu.cn/problem/3260/ 題意: 給出一個x,y,k。求從左上角到(x,y)最短路徑不少於k而且最快到達(x,y)的迷宮。(

UVA 10042 Smith Numbers數論

sizeof ret col 保存 進行 uva nal isp published Smith Numbers Background While skimming his phone directory in 1982, Albert Wilansky, a ma

POJ 2386 Lake CountingDFS

poj 所有 tput algorithm space 答案 復雜度 for pre 題意:有一個大小為N×M的園子,雨後積起了水。八連通的積水被認為是連在一起的。求園子裏一共有多少水窪? * * * * W* (八連通指的就是左圖中相對W的*的部分)

HIT1946 希爾伯特分形曲線dfs

pic ios put 組成 快的 結束 return ext ati 補第二次期末考的題……發現代碼細節還需要加強啊……這樣一道題一直犯小錯誤。 題目鏈接:   http://acm.hit.edu.cn/hoj/problem/view?id=1946 題目描述:

POJ - 3984 - 迷宮問題 DFS

define class ac代碼 ng- art clu cstring fff table 迷宮問題 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10936 Accep

uva1103dfs

lan hide type case clu for ont eof origin UVA - 1103 還是沒寫好,,看的別人的 1 #include <iostream> 2 #include <cstdio> 3 #includ

Kick the ball!dfs湖南省賽第十屆

board have class weight you determine wikipedia spa scanf Problem K: Kick the ball! Time Limit: 1 Sec Memory Limit: 128 MB S

HDU 5952 Counting Cliquesdfs

lap ont there ins -- icpc output stream script Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Ja

HRBUST2030dfs

-c math cas bitset bsp lin ng- printf n) 成語接龍 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %lld , %