题目链接:点击打开链接

题目大意:

在一个由1 0组成的图中,对于和任何一个1,和它相邻的所有的1为一个星系,赋一个小写字母。最后输出新图。

解题思路:

刚开始bfs裸搜一遍,发现不对,tm的对于形状相同的星系就算没在一起也要赋和之前相同的小写字母。惊了,遂想到hash,然而,这就触碰到我的知识盲区了。。。真的不知道hash那个值怎么得来比较好。就去看了大佬的讲解,就是每个点与它平均值得差的四次方相加。不过hash的方法肯定很多,这只是其中一种。然后就是每次先将得到的图遍历一遍。得到它的hash值,然后去找之前有没有存过相同的,找到的话就返回跟它相同的小写字母,否则就将字母+1,。细节看代码,

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#include <set>
#include <functional>
#define rank ra
#define lson rt<<1
#define rson rt<<1|1
#define pb push_back
#define hash haha
using namespace std;
typedef long long ll;
int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,-1,-1,-1,0,1,1,1};
const int mod=1000007;
int n,m,num,idx;
char c;
char a[110][110];
bool vis[110][110];
int head[mod];
struct node
{int area,next;char flag;ll hash;
}edge[mod<<2];
struct point
{int x,y;
}p[200];
void add(int x,int y)
{num++;p[num].x=x;p[num].y=y;
}
void dfs(int x,int y)   //找所有连接起来的点
{for(int i=0;i<8;i++){int xx=x+dx[i];int yy=y+dy[i];if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]=='1'&&vis[xx][yy]==0){add(xx,yy);vis[xx][yy]=1;dfs(xx,yy);}}
}
double vc(int x,int y,double dx,double dy)
{return 1.0*(x-dx)*(x-dx)*(x-dx)*(x-dx)+1.0*(y-dy)*(y-dy)*(y-dy)*(y-dy);
}
char hash(int area,ll ha)
{int key=ha%mod;for(int i=head[key];i!=-1;i=edge[i].next)   //通过链表查找hash 有损hash{if(edge[i].area==area&&edge[i].haha==ha)return edge[i].flag;}edge[idx].area=area;edge[idx].haha=ha;edge[idx].flag=c++;edge[idx].next=head[key];head[key]=idx++;return c-1;
}
void vs(int x,int y)
{num=0;add(x,y);vis[x][y]=1;dfs(x,y);double dx=0,dy=0;int nx=0,ny=0;for(int i=1;i<=num;i++){nx+=p[i].x;ny+=p[i].y;}dx=nx*1.0/num;      //求出平均值dy=ny*1.0/num;double ha=0;for(int i=1;i<=num;i++)ha+=vc(p[i].x,p[i].y,dx,dy);        //查找hash值char k=hash(num,(ll)(ha*100));      //得到hash值乘10的倍数for(int i=1;i<=num;i++)a[p[i].x][p[i].y]=k;        //赋值
}
void read()
{for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf(" %c",&a[i][j]);
}
int main()
{while(scanf("%d%d",&m,&n)!=EOF){c='a';idx=0;memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));read();     //输入for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]=='1')     //找到1就搜索vs(i,j);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){printf("%c",a[i][j]);}printf("\n");}}return 0;
}

POJ-1175:Starry Night(搜索+hash)相关推荐

  1. POJ 1175 Starry Night 笔记

    给出天空中的星星,用字母标出星座.图中含有相同的星座(星星数相同,有可能旋转),用相同的字母标识.

  2. POJ 1324 Holedox Moving 搜索

    题目地址: http://poj.org/problem?id=1324 优先队列---A*的估价函数不能为蛇头到(1,1)的距离,这样会出错. 看了discuss,有大神说这题A*的估价函数为BFS ...

  3. POJ 3320 尺取法,Hash,map标记

    1.POJ 3320 2.链接:http://poj.org/problem?id=3320 3.总结:尺取法,Hash,map标记 看书复习,p页书,一页有一个知识点,连续看求最少多少页看完所有知识 ...

  4. Poj 1077 eight(BFS+全序列Hash解八数码问题)

    一.题意 经典的八数码问题,有人说不做此题人生不完整,哈哈.给出一个含数字1~8和字母x的3 * 3矩阵,如: 1  2  X            3 4  6            7  5  8 ...

  5. hdu 1186(搜索+HASH)

    方程的解数 Time Limit: 15000MS   Memory Limit: 128000K Total Submissions: 7045   Accepted: 2417 Case Time ...

  6. J - 最强王者 POJ - 1753 Flip Game 搜索+状态压缩

    J - 最强王者 POJ - 1753 Flip game is played on a rectangular 4x4 field with two-sided pieces placed on e ...

  7. BZOJ2719 - [Violet 4]银河之星 (记忆化搜索+hash)

    Description Input Output Solution 一看到这题的我是懵逼的,好像有好多状态,妈妈怎么办? 然而仔细读题目,转动我们的脑子可以发现,由于每个棋子可以向各个方向移3格,且只 ...

  8. POJ 1414 Life Line(搜索)

    题意: 给定一块正三角形棋盘,然后给定一些棋子和空位,棋子序号为a(1<=a<=9),group的定义是相邻序号一样的棋子. 然后到C(1<=N<=9)棋手在空位放上自己序号C ...

  9. POJ 1321 棋盘问题 搜索

    Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...

最新文章

  1. zabbis监控mysql数据库
  2. 完全详解--Silverlight 下载文件
  3. Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用
  4. 洛谷 - P3358 最长k可重区间集问题(最大费用最大流+思维建边)
  5. 去除 position:fixed 抖动的方法
  6. php的用户认证(有点难度 多看几遍吧)
  7. HTML5和Intersection Observer的响应式图像优化简介
  8. html在线设计,快速建站 20个设计优秀的HTML网站模板(免费)
  9. 管理之道(七) - 不可奖励员工错误的行为
  10. 撰写项目的解决方案要点解析
  11. win7系统电脑连接小米蓝牙音箱
  12. ☆汇总☆电力电子技术simulink仿真电路分析
  13. Qt实战案例(13)——Qt的界面外观详细介绍
  14. 单舵轮(叉车)AGV里程计数据解算
  15. PyQt5简易本地视频播放器
  16. 抓取沪A股票资金流向数据
  17. 串口公头母头: RS232 DB9 公头 母头 串口引脚定义
  18. LaTeX排版系统及与word的区别
  19. 阿里巴巴面试java研发工程师实录
  20. 好玩的Python-摩斯码发报机

热门文章

  1. Bootstrap 组件:导航条组件的使用
  2. c++中如何动态生成变量名
  3. 小鹏汽车L3自动驾驶方案---基于NVIDIA Xavier
  4. python爬虫实例教程-python动态爬虫的实例分享
  5. 用 python 做 z 检验,t 检验
  6. python将Excel数据自动生成Word报告【Pyhon-docx\openpyxl】
  7. SpringBoot使用@Scheduled注解实现定时任务
  8. 如何使用BARY节能:智能家居
  9. 用计算机弹咖喱鸡,我的学霸男友
  10. 动态创建WebService