POJ 1021 人品题

报告见代码。。

  1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <algorithm>
5 using namespace std;
6
7 const int MAX=105;
8 int dir[4][2]={1,0,-1,0,0,1,0,-1};
9 int h,w,n;
10 int maze[MAX][MAX];
11 int maze2[MAX][MAX];
12 struct{
13 int x,y;
14 }save[1000];
15 int sa;
16 int h1[1000];
17 int h2[1000];
18
19 void dfs(int i,int j,int (*p)[MAX]){
20 p[i][j]=0;
21 save[++sa].x=i;save[sa].y=j;
22 for(int k=0;k<4;k++){
23 int tx,ty;
24 tx=i+dir[k][0];
25 ty=j+dir[k][1];
26 if(p[tx][ty]==1&&tx<h&&tx>=0&&ty<w&&ty>=0)
27 dfs(tx,ty,p);
28 }
29 }
30
31 void calculate(int *ha,int &top){ //HASH函数是各点对的距离的平方。。。也过。
32 int i,j,x=0,y=0; top++;
33 for(i=1;i<=sa;i++){
34 x=save[i].x;
35 y=save[i].y;
36 for(j=i+1;j<=sa;j++){
37 int dx=abs(x-save[j].x);
38 int dy=abs(y-save[j].y);
39 int dis=dx*dx+dy*dy;
40 ha[top]+=dis;
41 }
42 }
43 }
44
45 void slove(int (*p)[MAX],int *ha,int &top){
46 int i,j;
47 for(i=0;i<h;i++){
48 for(j=0;j<w;j++){
49 sa=0;
50 if(p[i][j]==1){
51 dfs(i,j,p);
52 calculate(ha,top);
53 }
54 }
55 }
56 }
57
58 int main(){
59 int x,y,cas;
60 scanf("%d",&cas);
61 while(cas--){
62 scanf("%d%d%d",&w,&h,&n);
63 memset(maze,0,sizeof(maze));
64 memset(maze2,0,sizeof(maze2));
65 memset(h1,0,sizeof(h1));
66 memset(h2,0,sizeof(h2));
67 int top1=-1,top2=-1;
68 for(int i=1;i<=n;i++){
69 scanf("%d%d",&x,&y);
70 maze[y][x]=1;
71 }
72 /* for(int i=0;i<h;i++){
73 for(int j=0;j<w;j++)
74 printf("%d ",maze[i][j]);
75 printf("\n");
76 }*/
77 for(int i=1;i<=n;i++){
78 scanf("%d%d",&x,&y);
79 maze2[y][x]=1;
80 }
81 /* for(int i=0;i<h;i++){
82 for(int j=0;j<w;j++)
83 printf("%d ",maze2[i][j]);
84 printf("\n");
85 }*/
86 slove(maze,h1,top1);
87 slove(maze2,h2,top2);
88 if(top1!=top2){
89 printf("NO\n");
90 continue;
91 }
92 bool flag=true;
93 sort(h1,h1+top1+1);
94 sort(h2,h2+top2+1);
95 for(int i=0;i<=top1;i++){
96 // printf("%d %d \n",h1[i],h2[i]);
97 if(h1[i]!=h2[i]){
98 flag=false;
99 break;
100 }
101 }
102 if(!flag)
103 printf("NO\n");
104 else
105 printf("YES\n");
106 }
107 return 0;
108 }

POJ 1021 人品题,布布扣,bubuko.com

时间: 2024-10-10 08:50:41

POJ 1021 人品题的相关文章

[转]POJ的刷题指南(加了超链接的)

网上看到的转过来一下,顺便把题目都加了个超链接,方便刷起~ POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法:       (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.       (4)递推.       (5)构造法.(po

最短路+线段交 POJ 1556 好题

1 // 最短路+线段交 POJ 1556 好题 2 // 题意:从(0,5)到(10,5)的最短距离,中间有n堵墙,每堵上有两扇门可以通过 3 // 思路:先存图.直接n^2来暴力,不好写.分成三部分,起点 终点和之间的点:中间点之间:起点和终点的距离 4 // n最大为18所以直接n^3最短路 5 6 7 #include <cstdio> 8 #include <cstring> 9 #include <iostream> 10 #include <algo

poj 1021 2D-Nim 模拟

题意: 给两个平面,每个平面上有一些点,相邻的点可构成点集,为两个平面内的点集是够都对应相似.两个点集相似是指经过对称或旋转或平移后相等. 分析: 直接模拟判断. 代码: //poj 1021 //sep9 #include <iostream> #include <vector> #include <algorithm> using namespace std; int w,h,n; int g[128][128]; int vis[128][128]; int di

poj循序渐进300题

主要是整理起来自己用的.网上有多个版本. 初级: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstr

poj万人题

poj提交数量过万的题,除了水爆了的题就是无比经典的,不得不刷的题. 准备将poj上提交次数过万的题刷个遍. 持续更新中... poj 2828(线段树) 此题乃是Zhu, Zeyuan神牛出的,拿到题目就觉得这题真的是很有意思,苦想一天无果. 感叹大神的思维果真奇妙. 随随便便提出的问题都成为了如此经典.看了下讨论发现貌似不好想,再尝试了下发现有些问题还是没有想出解决掉方法,而且越来越混乱, 无奈只能看题解了... 由于插队是具有最高优先级,而且显然最后一个人插在哪里那么他的最终位置就是哪里.

poj 2002(好题 链式hash+已知正方形两点求另外两点)

Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 18493   Accepted: 7124 Description A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degree angles. It is also a polygon such that rotating abou

数学之欧拉函数 &amp;几道poj欧拉题

欧拉函数总结+证明 欧拉函数总结2 POJ 1284 原根 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int Euler(int n) { int res=n; for(int i=2;i*i<=n;i++) { while(n%i==0) { n/=i; res

poj 1852思维题

背景:挑战程序设计竞赛上的题,好思维.来就想暴力枚举都还没有仔细思考有没有数学规律,n超过20就不适合用2的n次方的算法了. 思路:最短时间十分容易讨论,这里最大时间很巧妙,两只蚂蚁相撞然后各自反向走,可以想成两只蚂蚁绕过,各走各的,这样早最大时间就简单了,就是所有走到端点的时间中最大的. 代码: #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #in

poj 2245 水题

求组合数,dfs即可 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 int N,m,t; 9 int a[15],vis[15]; 10 void dfs(int st,int n) 11 { 12