Starry Night [USACO]
这道题目也比较简单,先想好怎么写,稍微写写伪代码,之后实现了即可。
/* ID: zhangyc1 LANG: C++ TASK: starry */ #include <string> #include <cstring> #include <cstdlib> #include <cstdio> using namespace std;struct SStar {int nStarNum, nLeft, nRight, nTop, nBottom;bool arrIsStar[100][100];SStar():nStarNum(1), nLeft(0), nTop(0), nRight(100), nBottom(100){memset(arrIsStar, 0, sizeof(arrIsStar));} }; SStar arrStar[27]; bool arrVisited[100][100]; char arrChMap[100][101], arrSkyMap[100][101]; int H, W; int nCurStarIdx = 0; int arrDirectionY[8] = {0, 1, 1, 1, 0, -1, -1, -1}; int arrDirectionX[8] = {-1, -1, 0, 1, 1, 1, 0, -1};// 上-右上-右-右下-下-左下-左-左上 void GenStar(int x, int y);void prepairData() {scanf("%d%d", &W, &H);for (int i = 0; i < H; i++){scanf("%s", arrSkyMap[i]);memset(arrChMap[i], '0', W);arrChMap[i][W] = '\0';} }void process() {for (int i = 0; i < H; i++){for (int j = 0; j < W; j++){if (!arrVisited[i][j] && arrSkyMap[i][j] == '1'){GenStar(i, j);}}}for (int i = 0; i < H; i++){printf("%s\n", arrChMap[i]);} }int main(){freopen("starry.in","r",stdin);freopen("starry.out","w",stdout);prepairData();process();return 0; }void dfs(int x, int y) {//printf("X = %d,Y = %d\n", x, y);arrStar[nCurStarIdx].nStarNum++;arrStar[nCurStarIdx].arrIsStar[x][y] = true;arrVisited[x][y] = true;if (x < arrStar[nCurStarIdx].nTop)arrStar[nCurStarIdx].nTop = x;if (y < arrStar[nCurStarIdx].nLeft)arrStar[nCurStarIdx].nLeft = y;if (y > arrStar[nCurStarIdx].nRight)arrStar[nCurStarIdx].nRight = y;if (x > arrStar[nCurStarIdx].nBottom)arrStar[nCurStarIdx].nBottom = x;// 判断8个方向for (int i = 0; i < 8; i++){int newX = x + arrDirectionX[i], newY = y + arrDirectionY[i];if (newX >= 0 && newX < H && newY >= 0 && newY < W && !arrVisited[newX][newY] && arrSkyMap[newX][newY] == '1')dfs(newX, newY);} }bool CompareStar(int nStar1, int nStar2) {if (arrStar[nStar1].nStarNum != arrStar[nStar2].nStarNum)return false;if (arrStar[nStar1].nRight - arrStar[nStar1].nLeft == arrStar[nStar2].nBottom - arrStar[nStar2].nTop&& arrStar[nStar1].nBottom - arrStar[nStar1].nTop == arrStar[nStar2].nRight - arrStar[nStar2].nLeft){bool bEqual = true;// 右旋90for (int i = arrStar[nStar1].nLeft; i <= arrStar[nStar1].nRight && bEqual; i++){// 每列变为行int nLineRe = i - arrStar[nStar1].nLeft + arrStar[nStar2].nTop;for (int j = arrStar[nStar1].nBottom; j >= arrStar[nStar1].nTop; j--){int nColRe = arrStar[nStar1].nBottom - j + arrStar[nStar2].nLeft;if (arrStar[nStar1].arrIsStar[j][i] != arrStar[nStar2].arrIsStar[nLineRe][nColRe]){bEqual = false;break;}}}if (bEqual)return true;bEqual = true;// 右旋270for (int i = arrStar[nStar1].nRight; i >= arrStar[nStar1].nLeft && bEqual; i--){// 每列变为行int nLineRe = arrStar[nStar1].nRight - i + arrStar[nStar2].nTop;for (int j = arrStar[nStar1].nTop; j <= arrStar[nStar1].nBottom; j++){int nColRe = j - arrStar[nStar1].nTop + arrStar[nStar2].nLeft;if (arrStar[nStar1].arrIsStar[j][i] != arrStar[nStar2].arrIsStar[nLineRe][nColRe]){bEqual = false;break;}}}if (bEqual)return true;bEqual = true;// 右旋90 并左右互换for (int i = arrStar[nStar1].nLeft; i <= arrStar[nStar1].nRight && bEqual; i++){// 每列变为行int nLineRe = i - arrStar[nStar1].nLeft + arrStar[nStar2].nTop;for (int j = arrStar[nStar1].nBottom; j >= arrStar[nStar1].nTop; j--){int nColRe = arrStar[nStar2].nRight - arrStar[nStar1].nBottom + j;if (arrStar[nStar1].arrIsStar[j][i] != arrStar[nStar2].arrIsStar[nLineRe][nColRe]){bEqual = false;break;}}}if (bEqual)return true;bEqual = true;// 右旋270 并左右互换for (int i = arrStar[nStar1].nRight; i >= arrStar[nStar1].nLeft && bEqual; i--){// 每列变为行int nLineRe = arrStar[nStar1].nRight - i + arrStar[nStar2].nTop;for (int j = arrStar[nStar1].nTop; j <= arrStar[nStar1].nBottom; j++){int nColRe = arrStar[nStar2].nRight - j + arrStar[nStar1].nTop;if (arrStar[nStar1].arrIsStar[j][i] != arrStar[nStar2].arrIsStar[nLineRe][nColRe]){bEqual = false;break;}}}if (bEqual)return true;}if (arrStar[nStar1].nRight - arrStar[nStar1].nLeft == arrStar[nStar2].nRight - arrStar[nStar2].nLeft&& arrStar[nStar1].nBottom - arrStar[nStar1].nTop == arrStar[nStar2].nBottom - arrStar[nStar2].nTop){bool bEqual = true;// 原状for (int i = arrStar[nStar1].nTop; i <= arrStar[nStar1].nBottom && bEqual; i++){int nLineRe = i - arrStar[nStar1].nTop + arrStar[nStar2].nTop;for (int j = arrStar[nStar1].nLeft; j <= arrStar[nStar1].nRight; j++){int nColRe = j - arrStar[nStar1].nLeft + arrStar[nStar2].nLeft;if (arrStar[nStar1].arrIsStar[i][j] != arrStar[nStar2].arrIsStar[nLineRe][nColRe]){bEqual = false;break;}}}if (bEqual)return true;bEqual = true;// 左右互换for (int i = arrStar[nStar1].nTop; i <= arrStar[nStar1].nBottom && bEqual; i++){int nLineRe = i - arrStar[nStar1].nTop + arrStar[nStar2].nTop;for (int j = arrStar[nStar1].nLeft; j <= arrStar[nStar1].nRight; j++){int nColRe = arrStar[nStar2].nRight - j + arrStar[nStar1].nLeft;if (arrStar[nStar1].arrIsStar[i][j] != arrStar[nStar2].arrIsStar[nLineRe][nColRe]){bEqual = false;break;}}}if (bEqual)return true;bEqual = true;// 上下互换for (int i = arrStar[nStar1].nTop; i <= arrStar[nStar1].nBottom && bEqual; i++){int nLineRe = arrStar[nStar2].nBottom - i + arrStar[nStar1].nTop;for (int j = arrStar[nStar1].nLeft; j <= arrStar[nStar1].nRight; j++){int nColRe = j - arrStar[nStar1].nLeft + arrStar[nStar2].nLeft;if (arrStar[nStar1].arrIsStar[i][j] != arrStar[nStar2].arrIsStar[nLineRe][nColRe]){bEqual = false;break;}}}if (bEqual)return true;bEqual = true;// 上下+左右互换for (int i = arrStar[nStar1].nTop; i <= arrStar[nStar1].nBottom && bEqual; i++){int nLineRe = arrStar[nStar2].nBottom - i + arrStar[nStar1].nTop;for (int j = arrStar[nStar1].nLeft; j <= arrStar[nStar1].nRight; j++){int nColRe = arrStar[nStar2].nRight - j + arrStar[nStar1].nLeft;if (arrStar[nStar1].arrIsStar[i][j] != arrStar[nStar2].arrIsStar[nLineRe][nColRe]){bEqual = false;break;}}}if (bEqual)return true;}return false; }int FindSimilar() {for (int i = 0; i < nCurStarIdx; i++){bool bSimilar = CompareStar(i, nCurStarIdx);if (bSimilar)return i;}return -1; }void MarkStar(int i, char ch) {for (int m = arrStar[i].nTop; m <= arrStar[i].nBottom; m++){for (int n = arrStar[i].nLeft; n <= arrStar[i].nRight; n++){if (arrStar[i].arrIsStar[m][n])arrChMap[m][n] = ch;}} }void GenStar(int x, int y) {arrStar[nCurStarIdx].nLeft = arrStar[nCurStarIdx].nTop = 100, arrStar[nCurStarIdx].nRight = arrStar[nCurStarIdx].nBottom = arrStar[nCurStarIdx].nStarNum = 0;memset(arrStar[nCurStarIdx].arrIsStar, 0, sizeof(arrStar[nCurStarIdx].arrIsStar));dfs(x, y);// 从0 -- nCurStarIdx 查找此星图,如未找到则记录此次星图int nFindRs = FindSimilar();if (nFindRs >= 0){MarkStar(nCurStarIdx, 'a' + nFindRs);}else{MarkStar(nCurStarIdx, 'a' + nCurStarIdx);nCurStarIdx++;} }
转载于:https://www.cnblogs.com/doublemystery/archive/2013/04/19/3030415.html
Starry Night [USACO]相关推荐
- USACO 5.1 Starry Night(模拟)
2015-03-25 22:14:58 思路:大模拟... 首先用floodfill判出每一个连通块,然后就是暴力枚举每个块的8个状态了... 写的超级暴力... 一开始MLE,把数组从int改到bo ...
- usaco Starry Night
就是最简单能想到的那种拿到两个形状然后匹配. 但是有好多好多 /* ID: modengd1 PROG: starry LANG: C++ */ #include <iostream> # ...
- USACO starry
这个题就是图像识别类型的模拟题, 我们可以先将每个图像所在的矩形求出来然后在进行比对,实现的时候我们对每个图形进行染色, 记录染色的区域, 在统计一下染色的数目, 那个两个图像相同的充分必要条件就是a ...
- Usaco Training Section 5.1 Starry Night
有很多星座,让你给这些星座编号.(一个星座翻折.旋转得到的星座算同一种) 直接dfs找联通块,最主要的是判同一种.我是把一个星座的每个点排序,用每个点减去第一个点,得出每个点的相对位置,再把每个点的行 ...
- Starry Night
题意:转载NOCOW翻译(http://www.nocow.cn/index.php/Translate:USACO/starry) 描述 高高的星空,簇簇闪耀的群星形态万千.一个星座(cluster ...
- usaco Shaping Regions
这就是usaco 前面的windows area的变形. /* ID:jinbo wu TASK:rect1 LANG:C++ */ #include<iostream> #include ...
- usaco Postal Vans(dp)
是哈密顿回路,然后...就不知道怎么写了 ,以前写过类似的不过情况没这么多也没这么复 usaco training 6.1.1 Postal Vans 题解 标签: usaco training题解d ...
- usaco Beef McNuggets
这两天贼烦,ccf炸了,还有一个烦心事.哎我都不知道自己能不能坚持下去了.马上期末考了.这段时间还是抓紧时间复习吧同时刷usaco的节奏要跟以前一样了,毕竟课少了. 题解: 只要你知道以下的数论结论, ...
- usaco前两章小结
usaco 暑假老师有推荐做但是那个题目太长了,而且·大部分都是废话做起来特别慢,而且当时自己基本上什么都不懂,太难了所以看了题解做了两题就放弃了. 转眼就上学了,因为想学习acm所以就胡乱找题做但是 ...
最新文章
- 华为云计算之储存基础知识
- WGS 1984 Web Mercator 对于在线地图服务的意义
- python 3.x 爬虫基础---http headers详解
- MMDetectionV2 + Colab
- matlab和vlfeat关联,VLFeat在matlab和vs中安装
- 作者:刘松灵(1988-),男,就职于中国人民银行征信中心数据部
- linux 查找某目录下包含关键字内容的文件(文件内容、grep)
- C#模板引擎NVelocity实战项目演练
- 用ldd查看C++程序的依赖库
- python接口自动化参数化_python接口自动化-参数化
- 《UNIX网络编程 卷1:套接字联网API》学习笔记——基本UDP套接字编程
- 首次 golang爬虫插件gocolly/colly 使用经历
- Openstack 虚拟机通讯
- STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)
- 一行代码解决ie浏览器的兼容
- 【软件测试必备技能】Linux
- 音频混音接口调节音量及设置静音
- 普通耳机的多源感知功能(智能耳机)
- 自损八百!美光停止供货华为
- CSS Text Decoration
热门文章
- IE6/IE7下:inline-block不兼容的问题
- Eclipse+CDT+MinGW搭建C++环境 (转)
- OpenCV提示—“CV_BGR2HSV”: 未声明的标识符—解决
- 机器学习资源和路线图
- 将给出的整数x翻转_每日一题:1.罗马数字转整数
- 五子棋java判断平局_2020-10-03 Java初级项目——从零开始制作一个简易五子棋游戏...
- 合并远程仓库到本地_Git工作区、暂存区、本地仓库和远程仓库科普
- 008_HttpServletRequest对象
- 013_JavaScript函数
- 001_JSON-lib下载和文档