这道题目也比较简单,先想好怎么写,稍微写写伪代码,之后实现了即可。

/*
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]相关推荐

  1. USACO 5.1 Starry Night(模拟)

    2015-03-25 22:14:58 思路:大模拟... 首先用floodfill判出每一个连通块,然后就是暴力枚举每个块的8个状态了... 写的超级暴力... 一开始MLE,把数组从int改到bo ...

  2. usaco Starry Night

    就是最简单能想到的那种拿到两个形状然后匹配. 但是有好多好多 /* ID: modengd1 PROG: starry LANG: C++ */ #include <iostream> # ...

  3. USACO starry

    这个题就是图像识别类型的模拟题, 我们可以先将每个图像所在的矩形求出来然后在进行比对,实现的时候我们对每个图形进行染色, 记录染色的区域, 在统计一下染色的数目, 那个两个图像相同的充分必要条件就是a ...

  4. Usaco Training Section 5.1 Starry Night

    有很多星座,让你给这些星座编号.(一个星座翻折.旋转得到的星座算同一种) 直接dfs找联通块,最主要的是判同一种.我是把一个星座的每个点排序,用每个点减去第一个点,得出每个点的相对位置,再把每个点的行 ...

  5. Starry Night

    题意:转载NOCOW翻译(http://www.nocow.cn/index.php/Translate:USACO/starry) 描述 高高的星空,簇簇闪耀的群星形态万千.一个星座(cluster ...

  6. usaco Shaping Regions

    这就是usaco 前面的windows area的变形. /* ID:jinbo wu TASK:rect1 LANG:C++ */ #include<iostream> #include ...

  7. usaco Postal Vans(dp)

    是哈密顿回路,然后...就不知道怎么写了 ,以前写过类似的不过情况没这么多也没这么复 usaco training 6.1.1 Postal Vans 题解 标签: usaco training题解d ...

  8. usaco Beef McNuggets

    这两天贼烦,ccf炸了,还有一个烦心事.哎我都不知道自己能不能坚持下去了.马上期末考了.这段时间还是抓紧时间复习吧同时刷usaco的节奏要跟以前一样了,毕竟课少了. 题解: 只要你知道以下的数论结论, ...

  9. usaco前两章小结

    usaco 暑假老师有推荐做但是那个题目太长了,而且·大部分都是废话做起来特别慢,而且当时自己基本上什么都不懂,太难了所以看了题解做了两题就放弃了. 转眼就上学了,因为想学习acm所以就胡乱找题做但是 ...

最新文章

  1. 华为云计算之储存基础知识
  2. WGS 1984 Web Mercator 对于在线地图服务的意义
  3. python 3.x 爬虫基础---http headers详解
  4. MMDetectionV2 + Colab
  5. matlab和vlfeat关联,VLFeat在matlab和vs中安装
  6. 作者:刘松灵(1988-),男,就职于中国人民银行征信中心数据部
  7. linux 查找某目录下包含关键字内容的文件(文件内容、grep)
  8. C#模板引擎NVelocity实战项目演练
  9. 用ldd查看C++程序的依赖库
  10. python接口自动化参数化_python接口自动化-参数化
  11. 《UNIX网络编程 卷1:套接字联网API》学习笔记——基本UDP套接字编程
  12. 首次 golang爬虫插件gocolly/colly 使用经历
  13. Openstack 虚拟机通讯
  14. STM32F103移植FreeRTOS必须搞明白的系列知识---1(Cortex-CM3中断优先级)
  15. 一行代码解决ie浏览器的兼容
  16. 【软件测试必备技能】Linux
  17. 音频混音接口调节音量及设置静音
  18. 普通耳机的多源感知功能(智能耳机)
  19. 自损八百!美光停止供货华为
  20. CSS Text Decoration

热门文章

  1. IE6/IE7下:inline-block不兼容的问题
  2. Eclipse+CDT+MinGW搭建C++环境 (转)
  3. OpenCV提示—“CV_BGR2HSV”: 未声明的标识符—解决
  4. 机器学习资源和路线图
  5. 将给出的整数x翻转_每日一题:1.罗马数字转整数
  6. 五子棋java判断平局_2020-10-03 Java初级项目——从零开始制作一个简易五子棋游戏...
  7. 合并远程仓库到本地_Git工作区、暂存区、本地仓库和远程仓库科普
  8. 008_HttpServletRequest对象
  9. 013_JavaScript函数
  10. 001_JSON-lib下载和文档