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(模拟)相关推荐

  1. 【USACO5-1-2】夜空繁星Starry Night 模拟

    题目 判断是否相似的方法是将每两点的距离加起来 #include<iostream> #include<algorithm> #include<cstdio> #i ...

  2. 洛谷P1202 [USACO1.1]黑色星期五Friday the Thirteenth

    题目描述 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的一个周期,要求计算1900年1月1日至1900+N- ...

  3. USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)

    这题可真是又让我找到了八数码的感觉...哈哈.首先,第一次见题,没有思路,第二次看题,感觉是搜索,就这样写下来了.这题我几乎是一个点一个点改对的(至于为什么是这样,后面给你看一个神奇的东西),让我发现 ...

  4. 最强天文模拟软件:Starry Night Pro Plus 8 for Mac

    Starry Night Pro Plus 8是世界最强的,也是最专业好用的天文模拟软件,主要方便天文爱好者使用,软件提供了多达100个地球和月球地图显示岩石和元素位置.矿物成分.化学分布.重力.磁场 ...

  5. USACO starry

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

  6. Starry Night Pro Plus 8 Mac下载「天文模拟软件」

    Starry Night Pro Plus 8 Mac版是一款天文模拟软件,该软件提供了多达100个地球和月球地图显示岩石和元素位置.矿物成分.化学分布.重力.磁场.显著的地貌数据.新版本还改进了De ...

  7. 模拟/usaco 1.1.4 Broken Necklace

    题意 给你一个由r w b组成的字符串,这个串首位相接连成一个环 给出一个计算方法:选取这个环任意两个相邻元素的之间,由这个位置顺时针取连续相同元素,逆时针取连续相同元素,两个方向的元素可不同 求问能 ...

  8. Starry Night [USACO]

    这道题目也比较简单,先想好怎么写,稍微写写伪代码,之后实现了即可. /* ID: zhangyc1 LANG: C++ TASK: starry */ #include <string> ...

  9. JZOJ__Day 10:【普及模拟】【USACO】iCow播放器

    题目描述 被无止境的农活压榨得筋疲力尽后,Farmer John打算用他在MP3播放器市场新买的iCow来听些音乐,放松一下.FJ的iCow里存了N(1 <= N <= 1,000)首曲子 ...

最新文章

  1. 最短路径的求解方法(Dijkstra、Floyd算法)
  2. 经验分享:如何在自己的创业中,用上GPT-3等AI大模型
  3. 安卓的短信记录导入苹果_安卓换苹果手机后怎么转移便签数据?
  4. Apache Hook机制解析(上)——钩子机制的实现
  5. 【剑指offer】面试题40:数组中只出现一次的数字
  6. android 源码分析notification,# Notification 源码分析
  7. Qt5.7| C/C++ 超级简单一学就会的仿QQ宠物
  8. 最热开源静态网站生成器 TOP 20
  9. Linux系统分区及LVM使用(一)
  10. 基于Spring Security的认证授权_自定义登录页面_Spring Security OAuth2.0认证授权---springcloud工作笔记127
  11. 微软紧急更新 Windows 8.1 和 Server 2012 R2,修复两个严重漏洞
  12. 消除PyCharm中满屏的波浪线
  13. 【MATLAB】QPSK调制与解调在MATLAB平台上的实现
  14. Autocad中批量调整增强属性块中的元素的位置
  15. excel删除无尽空白行_Word技巧:快速删除Word文档中的空行
  16. python爬微博步骤手机_新浪微博爬取笔记(2):wap端模拟登陆 python
  17. 中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
  18. 计算机图像抠图有什么作用,电脑图片抠图怎么弄,如何在电脑上把图片里的某一部分抠出来...
  19. python实现pdf转png(转载)
  20. ALESA切削刀具1355.3904-01

热门文章

  1. 字体颜色的使用-CSS入门基础(006)
  2. 产品心理学(13-15)
  3. MPC5744-SPI
  4. 谷歌?亲斤手不推荐 选它就对了
  5. 【计蒜客-天上的星星】
  6. JavaFX-Stage
  7. P2195 HXY造公园
  8. 牧师与魔鬼(动作分离版)
  9. Could not initialize class
  10. BugKu——Web——社工-初步收集