USACO 5.1 Starry Night(模拟)
2015-03-25 22:14:58
思路:大模拟... 首先用floodfill判出每一个连通块,然后就是暴力枚举每个块的8个状态了... 写的超级暴力...
一开始MLE,把数组从int改到bool过了。后来TLE,加了一个剪枝(如果两个连通块内1的个数不等直接确定不一致)就过了。
关于8个状态:初始状态旋转 0°、90°、180°、270°
(overturn)初始状态镜面对称后旋转 0°、90°、180°、270°
1 /* 2 ID:naturec1 3 PROG: starry 4 LANG: C++ 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <cstdlib> 9 #include <cmath> 10 #include <vector> 11 #include <map> 12 #include <set> 13 #include <stack> 14 #include <queue> 15 #include <string> 16 #include <iostream> 17 #include <algorithm> 18 using namespace std; 19 20 #define MEM(a,b) memset(a,b,sizeof(a)) 21 #define REP(i,n) for(int i=0;i<(n);++i) 22 #define FOR(i,a,b) for(int i=(a);i<=(b);++i) 23 #define getmid(l,r) ((l) + ((r) - (l)) / 2) 24 #define MP(a,b) make_pair(a,b) 25 26 typedef long long ll; 27 typedef pair<int,int> pii; 28 const int INF = (1 << 30) - 1; 29 30 int W,H,clu_cnt,stx,sty; 31 int id[110][110]; 32 char g[110][110]; 33 int dir[8][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; 34 35 struct Cluster{ 36 bool mp[110][110]; 37 int num; 38 }clu[510]; 39 40 void Dfs(int x,int y){ 41 clu[clu_cnt].mp[x][y] = 1; 42 clu[clu_cnt].num++; 43 id[x][y] = clu_cnt; 44 REP(i,8){ 45 int tx = x + dir[i][0]; 46 int ty = y + dir[i][1]; 47 if(tx < 0 || tx >= H || ty < 0 || ty >= W 48 || g[tx][ty] == '0' || id[tx][ty] != -1) continue; 49 Dfs(tx,ty); 50 } 51 } 52 53 void Move(bool graph[110][110]){ 54 int minx = INF,miny = INF; 55 bool tmp[110][110] = {0}; 56 REP(i,H) REP(j,W) if(graph[i][j]){ 57 minx = min(minx,i); 58 miny = min(miny,j); 59 } 60 REP(i,H) REP(j,W) if(graph[i][j]) tmp[i - minx][j - miny] = 1; 61 memcpy(graph,tmp,sizeof(tmp)); 62 } 63 64 bool Judge(bool g1[110][110],bool g2[110][110]){ 65 REP(i,H) REP(j,W) if(g1[i][j] ^ g2[i][j]) return false; 66 return true; 67 } 68 69 bool Check(int a,int b){ 70 if(clu[a].num != clu[b].num) return false; 71 72 bool tmp[110][110]; 73 if(Judge(clu[a].mp,clu[b].mp)) return true; 74 75 //CW 90 76 MEM(tmp,0); 77 REP(i,H) REP(j,W) if(clu[a].mp[i][j]) tmp[j][W - i - 1] = 1; 78 Move(tmp); 79 if(Judge(tmp,clu[b].mp)) return true; 80 //CW 180 81 MEM(tmp,0); 82 REP(i,H) REP(j,W) if(clu[a].mp[i][j]) tmp[H - i - 1][W - j - 1] = 1; 83 Move(tmp); 84 if(Judge(tmp,clu[b].mp)) return true; 85 //CW 270 86 MEM(tmp,0); 87 REP(i,H) REP(j,W) if(clu[a].mp[i][j]) tmp[H - j - 1][i] = 1; 88 Move(tmp); 89 if(Judge(tmp,clu[b].mp)) return true; 90 //overturn -------------------------------------- 91 REP(i,H) REP(j,W / 2) if(clu[a].mp[i][j]) 92 swap(clu[a].mp[i][j],clu[a].mp[i][W - j - 1]); 93 Move(clu[a].mp); 94 if(Judge(clu[a].mp,clu[b].mp)) return true; 95 //CW 90 96 MEM(tmp,0); 97 REP(i,H) REP(j,W) if(clu[a].mp[i][j]) tmp[j][W - i - 1] = 1; 98 Move(tmp); 99 if(Judge(tmp,clu[b].mp)) return true; 100 //CW 180 101 MEM(tmp,0); 102 REP(i,H) REP(j,W) if(clu[a].mp[i][j]) tmp[H - i - 1][W - j - 1] = 1; 103 Move(tmp); 104 if(Judge(tmp,clu[b].mp)) return true; 105 //CW 270 106 MEM(tmp,0); 107 REP(i,H) REP(j,W) if(clu[a].mp[i][j]) tmp[H - j - 1][i] = 1; 108 Move(tmp); 109 if(Judge(tmp,clu[b].mp)) return true; 110 111 return false; 112 } 113 114 int main(){ 115 freopen("starry.in","r",stdin); 116 freopen("starry.out","w",stdout); 117 MEM(id,-1); 118 scanf("%d%d",&W,&H); 119 REP(i,H) scanf("%s",g[i]); 120 REP(i,H) REP(j,W) if(g[i][j] == '1'){ 121 if(id[i][j] != -1) continue; 122 stx = i,sty = j; 123 Dfs(i,j); 124 clu_cnt++; 125 } 126 REP(i,clu_cnt) Move(clu[i].mp); 127 int tot = 0,tag[510] = {0}; 128 REP(i,clu_cnt){ 129 if(tag[i]) continue; 130 tag[i] = ++tot; 131 FOR(j,i + 1,clu_cnt - 1) if(Check(i,j)){ 132 tag[j] = tag[i]; 133 } 134 } 135 REP(i,H){ 136 REP(j,W){ 137 if(g[i][j] == '0') printf("0"); 138 else printf("%c",'a' + tag[id[i][j]] - 1); 139 } 140 puts(""); 141 } 142 return 0; 143 }
转载于:https://www.cnblogs.com/naturepengchen/articles/4367186.html
USACO 5.1 Starry Night(模拟)相关推荐
- 【USACO5-1-2】夜空繁星Starry Night 模拟
题目 判断是否相似的方法是将每两点的距离加起来 #include<iostream> #include<algorithm> #include<cstdio> #i ...
- 洛谷P1202 [USACO1.1]黑色星期五Friday the Thirteenth
题目描述 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的一个周期,要求计算1900年1月1日至1900+N- ...
- USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)
这题可真是又让我找到了八数码的感觉...哈哈.首先,第一次见题,没有思路,第二次看题,感觉是搜索,就这样写下来了.这题我几乎是一个点一个点改对的(至于为什么是这样,后面给你看一个神奇的东西),让我发现 ...
- 最强天文模拟软件:Starry Night Pro Plus 8 for Mac
Starry Night Pro Plus 8是世界最强的,也是最专业好用的天文模拟软件,主要方便天文爱好者使用,软件提供了多达100个地球和月球地图显示岩石和元素位置.矿物成分.化学分布.重力.磁场 ...
- USACO starry
这个题就是图像识别类型的模拟题, 我们可以先将每个图像所在的矩形求出来然后在进行比对,实现的时候我们对每个图形进行染色, 记录染色的区域, 在统计一下染色的数目, 那个两个图像相同的充分必要条件就是a ...
- Starry Night Pro Plus 8 Mac下载「天文模拟软件」
Starry Night Pro Plus 8 Mac版是一款天文模拟软件,该软件提供了多达100个地球和月球地图显示岩石和元素位置.矿物成分.化学分布.重力.磁场.显著的地貌数据.新版本还改进了De ...
- 模拟/usaco 1.1.4 Broken Necklace
题意 给你一个由r w b组成的字符串,这个串首位相接连成一个环 给出一个计算方法:选取这个环任意两个相邻元素的之间,由这个位置顺时针取连续相同元素,逆时针取连续相同元素,两个方向的元素可不同 求问能 ...
- Starry Night [USACO]
这道题目也比较简单,先想好怎么写,稍微写写伪代码,之后实现了即可. /* ID: zhangyc1 LANG: C++ TASK: starry */ #include <string> ...
- JZOJ__Day 10:【普及模拟】【USACO】iCow播放器
题目描述 被无止境的农活压榨得筋疲力尽后,Farmer John打算用他在MP3播放器市场新买的iCow来听些音乐,放松一下.FJ的iCow里存了N(1 <= N <= 1,000)首曲子 ...
最新文章
- 最短路径的求解方法(Dijkstra、Floyd算法)
- 经验分享:如何在自己的创业中,用上GPT-3等AI大模型
- 安卓的短信记录导入苹果_安卓换苹果手机后怎么转移便签数据?
- Apache Hook机制解析(上)——钩子机制的实现
- 【剑指offer】面试题40:数组中只出现一次的数字
- android 源码分析notification,# Notification 源码分析
- Qt5.7| C/C++ 超级简单一学就会的仿QQ宠物
- 最热开源静态网站生成器 TOP 20
- Linux系统分区及LVM使用(一)
- 基于Spring Security的认证授权_自定义登录页面_Spring Security OAuth2.0认证授权---springcloud工作笔记127
- 微软紧急更新 Windows 8.1 和 Server 2012 R2,修复两个严重漏洞
- 消除PyCharm中满屏的波浪线
- 【MATLAB】QPSK调制与解调在MATLAB平台上的实现
- Autocad中批量调整增强属性块中的元素的位置
- excel删除无尽空白行_Word技巧:快速删除Word文档中的空行
- python爬微博步骤手机_新浪微博爬取笔记(2):wap端模拟登陆 python
- 中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
- 计算机图像抠图有什么作用,电脑图片抠图怎么弄,如何在电脑上把图片里的某一部分抠出来...
- python实现pdf转png(转载)
- ALESA切削刀具1355.3904-01