POJ 1175

  1 //本来写了个和1021相同的HASH,但没过,于是,抱着侥幸的心理,把它变成距离的四次方,
2 //我就呵呵了。。。
3 //这个题,完全靠概率。当然了,如果是把图翻转来比较,也是可以的。但好像很麻烦。。
4
5 #include <iostream>
6 #include <cstdio>
7 #include <cstring>
8
9 using namespace std;
10 const int MAX=105;
11 const int MOD=1500;
12 char map[MAX][MAX];
13 int dir[8][2]={1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,1,-1,-1};
14 int w,h;
15 struct cl{
16 char c;
17 int val,next;
18 }clu[600];
19 int hash[1500];
20 struct sv{
21 int x,y;
22 }save[200];
23 int sa,counted;
24 int tot;
25 void dfs(int i,int j){
26 map[i][j]=‘0‘; sa++;
27 save[sa].x=i; save[sa].y=j;
28 for(int k=0;k<7;k++){
29 int tx=i+dir[k][0];
30 int ty=j+dir[k][1];
31 if(map[tx][ty]==‘1‘&&tx>=0&&tx<h&&ty>=0&&ty<w){
32 dfs(tx,ty);
33 }
34 }
35 }
36
37 void calculate(){
38 int i,j,x,y;
39 int sum=0;
40 for(i=1;i<=sa;i++){
41 x=save[i].x; y=save[i].y;
42 for(j=i+1;j<=sa;j++){
43 int dx=abs(x-save[j].x);
44 int dy=abs(y-save[j].y);
45 sum=sum+(dx*dx+dy*dy)*(dx*dx+dy*dy);
46 }
47 }
48 int h=sum%MOD; char sure;
49 if(hash[h]==-1){
50 sure=‘a‘+(++counted);
51 clu[tot].val=sum;
52 clu[tot].c=sure;
53 clu[tot].next=hash[h];
54 hash[h]=tot++;
55 }
56 else{
57 // bool flag=false;
58 for(int e=hash[h];e!=-1;e=clu[e].next){
59 if(clu[e].val==sum){
60 clu[tot].c=clu[e].c;
61 clu[tot].val=sum;
62 clu[tot].next=hash[h];
63 hash[h]=tot++;
64 sure=clu[e].c;
65 // flag=true;
66 break;
67 }
68 }
69 }
70 for(i=1;i<=sa;i++){
71 map[save[i].x][save[i].y]=sure;
72 }
73 }
74
75 void slove(){
76 for(int i=0;i<h;i++){
77 for(int j=0;j<w;j++){
78 if(map[i][j]==‘1‘){
79 sa=0;
80 dfs(i,j);
81 calculate();
82 }
83 }
84 }
85 }
86
87 int main(){
88 int i;
89 while(scanf("%d%d",&w,&h)!=EOF){
90 for(i=0;i<h;i++)
91 scanf("%s",map[i]);
92 counted=-1; tot=0;
93 memset(hash,-1,sizeof(hash));
94 slove();
95 for(i=0;i<h;i++){
96 printf("%s",map[i]);
97 printf("\n");
98 }
99 }
100 return 0;
101 }

POJ 1175,布布扣,bubuko.com

时间: 2024-12-19 18:35:29

POJ 1175的相关文章

POJ 3449 Geometric Shapes --计算几何,线段相交

题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一步来吧. 还有收集了一个线段旋转的函数. Vector Rotate(Point P,Vector A,double rad){ //以P为基准点把向量A旋转rad return Vector(P.x+A.x*cos(rad)-A.y*sin(rad),P.y+A.x*sin(rad)+A.y*co

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

转载:poj题目分类(侵删)

转载:from: POJ:http://blog.csdn.net/qq_28236309/article/details/47818407 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K–0.50K:中短代码:0.51K–1.00K:中等代码量:1.01K–2.00K:长代码:2.01K以上. 短:1147.1163.1922.2211.2215.2229.2232.2234.2242.2245.2262.2301.2309.2313.2334.2346.2348

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

POJ——T2271 Guardian of Decency

http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   Accepted: 2463 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is

POJ——T2446 Chessboard

http://poj.org/problem?id=2446 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18560   Accepted: 5857 Description Alice and Bob often play games on chessboard. One day, Alice draws a board with size M * N. She wants Bob to use a lot of c

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+