2010年山东省第一届ACM大学生程序设计竞赛 Balloons (BFS)

题意 : 找联通块的个数,Saya定义两个相连是 |xa-xb| +
|ya-yb| ≤ 1
,但是Kudo定义的相连是 |xa-xb|≤1 并且
|ya-yb|≤1。输出按照两种方式数的联通块的各数。

思路 :
按照第一种定义方式就只能是上下左右四个位置,而第二种则是周围那8个都是相连的。


  1 #include <iostream>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <queue>
5 #include <string.h>
6 #include <cmath>
7
8 using namespace std;
9
10 struct node
11 {
12 int r,c ;
13 } p1,p2,p3;
14 int n,cnt1,cnt2 ;
15 char a[110][110] ;
16 int flag[110][110];
17 int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}} ;
18 int dir1[8][2] = {{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}} ;
19
20 void BFS1(int i,int j)
21 {
22 queue<node>Q ;
23 p1.r = i ;
24 p1.c = j ;
25 Q.push(p1) ;
26 flag[i][j] = 1 ;
27 while(!Q.empty())
28 {
29 p2 = Q.front() ;
30 Q.pop() ;
31 for(int i = 0 ; i < 4 ; i++)
32 {
33 int xx = p2.r+dir[i][0] ;
34 int yy = p2.c+dir[i][1] ;
35 if(xx >= 0 && yy >= 0 && xx < n && yy < n && !flag[xx][yy] && a[xx][yy] == ‘1‘)
36 {
37 flag[xx][yy] = 1 ;
38 p1.r = xx ;
39 p1.c = yy ;
40 Q.push(p1) ;
41 }
42 }
43 }
44 }
45 void BFS2(int i,int j)
46 {
47 queue<node>Q ;
48 p1.r = i ;
49 p1.c = j ;
50 Q.push(p1) ;
51 flag[i][j] = 1 ;
52 while(!Q.empty())
53 {
54 p2 = Q.front() ;
55 Q.pop() ;
56 for(int i = 0 ; i < 8 ; i++)
57 {
58 int xx = p2.r+dir1[i][0] ;
59 int yy = p2.c+dir1[i][1] ;
60 if(xx >= 0 && yy >= 0 && xx < n && yy < n && !flag[xx][yy] && a[xx][yy] == ‘1‘)
61 {
62 flag[xx][yy] = 1 ;
63 p1.r = xx ;
64 p1.c = yy ;
65 Q.push(p1) ;
66 }
67 }
68 }
69 }
70 int main()
71 {
72 int cas = 1 ;
73 while(~scanf("%d",&n) && n)
74 {
75 for(int i = 0 ; i < n ; i++)
76 scanf("%s",a[i]) ;
77 cnt1 = cnt2 = 0;
78 memset(flag,0,sizeof(flag)) ;
79 for(int i = 0 ; i < n ; i++)
80 for(int j = 0 ; j < n ; j++)
81 {
82 if(a[i][j] == ‘1‘ && !flag[i][j])
83 {
84 BFS1(i,j) ;
85 cnt1++ ;
86 }
87 }
88 memset(flag,0,sizeof(flag)) ;
89 for(int i = 0 ; i < n ; i++)
90 for(int j = 0 ; j < n ; j++)
91 {
92 if(a[i][j] == ‘1‘ && !flag[i][j])
93 {
94 BFS2(i,j) ;
95 cnt2++ ;
96 }
97 }
98 printf("Case %d: %d %d\n\n",cas++,cnt1,cnt2) ;
99 }
100 return 0;
101 }

时间: 2024-10-10 06:39:15

2010年山东省第一届ACM大学生程序设计竞赛 Balloons (BFS)的相关文章

sdut 2153 Clockwise (2010年山东省第一届ACM大学生程序设计竞赛)

题目大意: n个点,第i个点和第i+1个点可以构成向量,问最少删除多少个点可以让构成的向量顺时针旋转或者逆时针旋转. 分析: dp很好想,dp[j][i]表示以向量ji(第j个点到第i个点构成的向量)为终点的最大顺时针/逆时针向量数.状态转移方程为 dp[j][i] = max{dp[k][j]+1}. 问题个关键是如何判断2个向量是顺时针还是逆时针. 计算几何用的知识是求叉积和点积,叉积的作用是判断两个向量的左右(顺逆),点积的作用是判断两个向量的前后.举个例子,假设有2个向量v1,v2,‘*

sdut 2159 Ivan comes again!(2010年山东省第一届ACM大学生程序设计竞赛) 线段树+离散

先看看上一个题: 题目大意是: 矩阵中有N个被标记的元素,然后针对每一个被标记的元素e(x,y),你要在所有被标记的元素中找到一个元素E(X,Y),使得X>x并且Y>y,如果存在多个满足条件的元素,先比较X,选择X最小的那个,如果还是有很多满足条件的元素,再比较Y,选择Y最小的元素,如果不存在就输出两个-1: 分析: 直接暴力就行了 这个题目大意: 这个题是上个题的坚强版,每次会增加或减少一个点,仍然找到一个元素E(X,Y),使得X>x并且Y>y: 最多有200000次操作,每次只

山东省第一届ACM大学生程序设计竞赛(原题) 回顾 4.18

Phone Number 题目链接:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2151&cid=1172 题意很简单:给出N行电话号码,寻找有没有一串是另一串的前缀,有的话输出No,当然两个一样的也是No 题解:没有前缀0,直接用二维数组存,大循环就行了,用strcmp比较相等.不会超时. Hello World!     题目链接:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=215

[2011山东省第二届ACM大学生程序设计竞赛]——Identifiers

Identifiers Time Limit: 1000MS Memory limit: 65536K 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2163 题目描写叙述 Identifier is an important concept in the C programming language. Identifiers provide names for several language

山东省第二届ACM大学生程序设计竞赛 D

组合数: AC代码: #include <iostream> #include <cstdio> #include <cstring> using namespace std; int c[1010][1010]; int main() { int t, n, k; for(int i = 0; i < 1001; i++) c[i][0] = 1; for(int i = 1; i < 1001; i++) { for(int j = 1; j <

山东省第二届ACM大学生程序设计竞赛 Crack Mathmen

题意: 有一个解码规则: 字母或者数字的ASCII码,然后平方,%997,得出一个数字,如果这个数字不够三位数的话,在前面加上0凑够它,从而得到了一个数字. 现在我们要做的就是把他给出的一串数字解码,解出他的信息. 先把数字和字母对应的数字解出来,如果有相同的话,对号入座. AC代码: #include <iostream> #include <cstdio> #include <cstring> #include <map> #define mod 997

【总结】2018年山东省第九届ACM大学生程序设计竞赛

省赛刚结束,还是来总结一下吧 总的来说,这场省赛的表示实在是不能令人满意啊,自己还是太弱了呀. 首先,在开场之前,我们先看了一下十道题的题目,然后通过题目含义大概猜测了一下每道题的难度,并根据这个分配了一下读题(刚看到G.Game下意识认为是博弈论) 开题我和大佬负责读A因为感觉A题可做,五分钟后,按例刷一下榜看有人做出了C题,我们就分出一个人读C,我接着读A. 另外两个队友讨论了一下情况,就一人主打一人看代码,C题顺利AC. 然后我和他们讲了一下A题题意,自己还是菜呀,当时只想到了一种暴力的解

[简单思维题]Sequence(山东省第九届ACM大学生程序设计竞赛E题)

Problem Description We define an element a_iai? in a sequence "good", if and only if there exists a j(1\le j < i)j(1≤j<i) such that a_j < a_iaj?<ai?.Given a permutation pp of integers from 11 to nn. Remove an element from the permuta

[2012山东省第三届ACM大学生程序设计竞赛]——Fruit Ninja II

Fruit Ninja II 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2416 Time Limit: 5000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Have you ever played a popular game named "Fruit Ninja"? Fruit Ninja (known as Fruit Ninja