題幹

為了理解早期文明,考古學家經常學習用古代語言寫的文本。有一個這樣的語言,最早被使用於三千年前的埃及。這種語言是基於象形文字的符號。下圖是六種象形文字和它們的名稱。在這個問題中,你將寫一個程序來識別這六種符號。

輸入

這些輸入包含多個測試樣例,每個樣例表示的圖像包含一個或多個上面的符號。這些圖像以水平掃描線包含的黑色坐標和白色坐標的形式給出。在這些輸入數據中,每個掃描線被編碼成十六進制。例如,序列八個坐標"10011100"(一個黑像素,接著兩個白像素……)被表示成16進制的"9c"。16進制中只使用數字和小寫字母。每個樣例的第一行輸入包含兩個整數(H 和 W)H(0< H <= 200)表示行,W(0 < W <= 50)表示列。輸入的圖像數據從上到下。

輸入圖像形式滿足一下規則:

  1. 圖像僅包含上面的六種符號;
  2. 每個圖像至少有一個有效的符號;
  3. 每個黑色坐標是符號的一部分;
  4. 每個象形文字有一組連接的黑色像素組成,每個黑色像素在其頂部、底部、左側、右側、至少有一個其他黑色像素;
  5. 符號之間不互相重合並且不存在包含;
  6. 兩個對角線接觸的黑色像素總是有一個共同的接觸黑色像素
  7. 符號可以被扭曲,但每個符號都有一個拓撲上等同於上圖中的符號(兩個圖形如果在拓撲上是等價的,就意味著可以在不撕裂的情況下拉伸成另一個圖形)

最後的樣例輸入包含兩個0

輸出

對於每一個樣例,使用以下代碼顯示它的樣例編號,後面跟著一個字符串,該字符串包含在圖像中識別的每一個象形文字的一個字符。每一個輸出的字符串,按照字母順序打印

Ankh: A        Wedjat: J        Djed: D        Scarab: S        Was: W        Akhet: K

樣例輸入

100 25

0000000000000000000000000

0000000000000000000000000

...(50 lines omitted)...

00001fe0000000000007c0000

00003fe0000000000007c0000

...(44 lines omitted)...

0000000000000000000000000

0000000000000000000000000

150 38

00000000000000000000000000000000000000

00000000000000000000000000000000000000

...(75 lines omitted)...

0000000003fffffffffffffffff00000000000

0000000003fffffffffffffffff00000000000

...(69 lines omitted)...

00000000000000000000000000000000000000

00000000000000000000000000000000000000

樣例輸出

Case 1: AKW

Case 2: AAAAA

思路

通過數洞可以發現,六種符號的白色洞數分別為1 3 5 0 2。因此只需要通過DFS判斷它們的內部的白色聯通塊數量就可以做到識別文字。 大概編程思路如下:

  1. 先將數據從十六進制轉換成二進制
  2. DFS整塊矩陣。分別將聯通塊標號。底部的白色標記為首先標記為1。這裡的聯通塊包括:底部,黑色邊界,黑色邊界內的白色塊。
  3. 然後分別根據和對於黑色邊界相關的白色塊數量,判定符號。
    #include <iostream>
    #include <algorithm>
    #include <unordered_map>
    #include <unordered_set>
    #include <vector>
    #include <string>
    using namespace std;
    string hextobin(const string &hex); //進制轉換,一個16進制數轉換成四個二進制數
    void dfs(int row, int col, int count);
    void calhole(int row, int col);                           //統計黑色邊框相應的白色孔數
    unordered_map<char, string> hexmp;                        //將二進制與十六機制對應起來
    unordered_map<int, unordered_set<int>> nhole;             //相應黑邊對應的孔的標記值
    vector<string> pic;                                       //底板
    vector<vector<int>> tag;                                  //標記板
    int h, m;                                                 //行列
    int direction[4][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}}; //表示dfs的四個方向
    int main()
    {hexmp['0'] = "0000";hexmp['1'] = "0001";hexmp['2'] = "0010";hexmp['3'] = "0011";hexmp['4'] = "0100";hexmp['5'] = "0101";hexmp['6'] = "0110";hexmp['7'] = "0111";hexmp['8'] = "1000";hexmp['9'] = "1001";hexmp['a'] = "1010";hexmp['b'] = "1011";hexmp['c'] = "1100";hexmp['d'] = "1101";hexmp['e'] = "1110";hexmp['f'] = "1111";const char *wordmp = "WAKJSD"; //將孔數與文字對應起來int n = 0;while (cin >> h >> m && h){getchar();     //去除換行符m = m * 4 + 2; //轉換成二進制之後,列數變為原來四倍。且添加了倆列pic.clear();pic.push_back(string(m, '0')); //在首行添加全是0的一行string hex;for (int i = 0; i < h; i++){getline(cin, hex);                        //讀取一行pic.push_back("0" + hextobin(hex) + "0"); //將這一行轉換成二進制,然後存儲到底板pic中,在首列添加全是0的一列}pic.push_back(string(m, '0')); //在尾行添加全是0的一行h += 2;                        //添加了二行tag.clear();for (int i = 0; i < h; i++)tag.push_back(vector<int>(m, 0)); //生成h行m列的0矩陣。用以記錄“用數字標記聯通塊”的數據int count = 0; //聯通塊標記值,同時也代表聯通塊數量nhole.clear();for (int i = 0; i < h; i++) //dfs所有坐標for (int j = 0; j < m; j++)if (tag[i][j] == 0){dfs(i, j, ++count);if (pic[i][j] == '1') //記錄是黑邊的標號nhole[count];     //如果nhole中沒有下標為count,則添加,如果有,不進行操作,如果這裡不做統計,就會漏掉W,因為W內部沒有白色聯通塊,calhole無法統計}for (int i = 0; i < h; i++)for (int j = 0; j < m; j++)if (pic[i][j] == '1') //如果是黑色邊框calhole(i, j);string ans;ans.clear();for (auto hole : nhole) //將每一個的孔數轉換成文字ans.push_back(wordmp[hole.second.size()]);sort(ans.begin(), ans.end());cout << "Case " << ++n << ": " << ans << endl;}return 0;
    }string hextobin(const string &hex)
    {string bin{""};for (auto i : hex)bin += hexmp[i];return bin;
    }void dfs(int row, int col, int count)
    {tag[row][col] = count; //標記當前坐標值for (auto i : direction){int row2 = row + i[0];int col2 = col + i[1];//新坐標要在範圍內、沒被標記過而且與舊坐標的顏色相同if (row2 >= 0 && row2 < h && col2 >= 0 && col2 < m && tag[row2][col2] == 0 && pic[row2][col2] == pic[row][col])dfs(row2, col2, count);}
    }void calhole(int row, int col)
    {for (auto i : direction){int row2 = row + i[0];int col2 = col + i[1];/*如果標記值在合理範圍內、不相等而且新坐標的標記值不是1(即不是白色背板)就把標記值添加到相應的黑色標記值之下。注意:將有重複的標記值添加到某一個黑色標記值之下,這裡利用set元素不重複性質*/if (row2 >= 0 && row2 < h && col2 >= 0 && col2 < m && tag[row][col] != tag[row2][col2] && tag[row2][col2] != 1)nhole[tag[row][col]].insert(tag[row2][col2]);}
    }

UVA1103古代象形文字識別相关推荐

  1. Vision 圖像識別框架的使用

    阅读 137 收藏 10 2017-10-18 原文链接:www.itread01.com Google无人车之父.MIT/斯坦福/耶鲁专家带你进入无人驾驶之域 http://cn.udacity.c ...

  2. python使用opencv_教你快速使用OpenCV/Python/dlib進行眨眼檢測識別!

    摘要: 影象識別的新思路:眼睛縱橫比,看看大牛如果用這種思路玩轉識別眨眼動作! 今天我們來使用面部標誌和OpenCV 檢測和計算視訊流中的眨眼次數.為了構建我們的眨眼檢測器,我們將計算一個稱為眼睛縱橫 ...

  3. unrecongnized workspace file version : 未識別的工作空間文件版本

    unrecongnized workspace file version : 未識別的工作空間文件版本 1,高版本的AD,要导入其他的插件,点击 File–>Import Wizard -> ...

  4. easypr arm linux,arm linux下交叉編譯EasyPR中文車牌識別系統開發(一)

    EasyPR中文車牌識別系統開發(一),我主要介紹如何使用開源的EasyPR中文車牌識別系統,當然后面我會介紹訓練機器學習 SVM 支持向量機和 ANN 人工神經網絡模型在車牌識別的應用. 目錄: 一 ...

  5. 數據移動時發生***識別欄位其外顯值只有當使用了資料行清單且 IDENTITY_INSERT 為 ON 時才能指定...

    當數據在兩個相同結構的表中移動并且發生: ***識別欄位其外顯值只有當使用了資料行清單且 IDENTITY_INSERT 為 ON 時才能指定的錯誤時 用以下方法解決: SET IDENTITY_IN ...

  6. host速度 mtk usb_Openwrt MTK USB3.0 識別UASP存儲失敗的解決方案

    手裏有個MT7621的設備自己鼓搗鼓搗廢物利用用來做NAS用 發現之前用USB3.0的U盤都可以正常使用 換了USB3.0的移動硬盤盒無法識別出硬盤 執行lsusb -t發現該設備的驅動標示爲uas ...

  7. Uva1103 古代象形符号

    题目描述:题目很长,就贴一下题目连接吧=_=..https://vjudge.net/problem/UVA-1103 大意是输入一个H行W列的字符矩阵(H<=200, W<=50).每个 ...

  8. 谷歌ai人工智能叫什么_用Google新的AI强大工具翻译古代象形文字

    谷歌ai人工智能叫什么 It's been 221 years since the discovery of the Rosetta Stone-a key tool for deciphering ...

  9. UVA1103 古代象形符号 Ancient Messages解题报告(DFS,字符串)难度⭐⭐⭐⭐

    题目翻译 为了识别3000年前古埃及用到的6种象形文字.每组数据包含一个H行W列的字符矩阵(H≤200,W≤50 ),每个字符为4个相邻像素点的十六进制(例如,10011100对应的字符就是9c).转 ...

最新文章

  1. 大比拼:用24种可视化工具完成同一项任务的心得体会
  2. ABAP 数字处理相关内容备注
  3. 经典网页设计:12个简约风格的网站作品
  4. 猿题库 iOS 客户端架构设计-唐巧
  5. matlab多缝夫琅禾费,常见的多缝夫琅禾费衍射.ppt
  6. Shell编程入门基础上
  7. Oracle备份与恢复 expdp/impdp数据泵远程导入导出
  8. 计算机的显卡控制面板在哪里,nvidia控制面板在哪里打开
  9. Linux监控平台搭建二
  10. SCI收录的期刊查询
  11. 知乎高赞:让自己更优秀的 16 条法则
  12. 西门子博途1500双驱同步,伺服同步运行程序,3轴码垛博途程序,scl项目,同步轴走PN工艺对象
  13. 依托飞凌FETA40i-C核心板实现光时域反射仪的原理应用
  14. SYN8086语音合成芯片(TTS语音芯片)各项指标测试已完成,正式批量化生产
  15. python和nltk自然语言处理 脚本之家_想要入门自然语言处理,资料贫瘠,英语不好,大神推荐斯坦福的真的是搞不定,迷迷茫茫,不知从何下手?...
  16. python基础之内置成员和魔法函数(16)
  17. 准时制生产方式(Just In Time简称JIT)
  18. 在深夜加油站遇见哈利波特
  19. python爬虫小项目: 爬取百度贴吧帖子
  20. 人工智能学习(九):贝叶斯网路——墨大版

热门文章

  1. 游戏王生命值计算机,游戏王        直接扣生命值的卡有什么啊
  2. mipi DPHY时序讲解
  3. linux 安装wkhtmltopdf 所出的问题
  4. [SSD核心技术:FTL 16] 固态硬盘预读技术详解
  5. 异步fifo设计及验证verilog代码
  6. Java读取接口数据并保存到数据库
  7. 强大的抓包工具 Fiddler Web Debugger v5.0 中文破解版
  8. 【阅读】Extrinsic 6DoF Calibration of 3D LiDAR and Radar
  9. Windows Server系统使用Windows图片查看器
  10. 魔坊APP项目-19-种植园,我的背包、道具购买