The last case is followed by a line containing one zero.
For each case, print the case number (1, 2 …) and the connected block’s numbers with Saya and Kudo’s definition. Your output format should imitate the sample output. Print a blank line after each test case.
0
Case 1: 3 2
简单DFS,这道题刚开始还没咋看懂,后来才醒悟就是两个DFS,
这个和杭电油田那题目类似,前面的搜索找的四个方向的,后面的找的是八个方向的。。。
详情可见:
http://blog.csdn.net/lttree/article/details/19908339(八个方向的)
#include <iostream> using namespace std; char map1[101][101]; char map2[101][101]; int n,dis[4][2]={0,1,0,-1,1,0,-1,0}; int dis2[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,1,1,0,1,-1}; bool judge(int x,int y,int flag) { if(x<0 || y<0 || x>=n || y>=n) return 0; if(flag==1) { if(map1[x][y]==‘0‘) return 0; } else { if(map2[x][y]==‘0‘) return 0; } return 1; } void dfs1(int x,int y) { map1[x][y]=‘0‘; int i,xx,yy; for(i=0;i<4;++i) { xx=x+dis[i][0]; yy=y+dis[i][1]; if(judge(xx,yy,1)) { dfs1(xx,yy); } } return; } void dfs2(int x,int y) { map2[x][y]=‘0‘; int i,xx,yy; for(i=0;i<8;++i) { xx=x+dis2[i][0]; yy=y+dis2[i][1]; if(judge(xx,yy,2)) { dfs2(xx,yy); } } return; } int main() { int test,sum1,sum2; int i,j; test=1; while(cin>>n && n) { for(i=0;i<n;++i) for(j=0;j<n;++j) { cin>>map1[i][j]; map2[i][j]=map1[i][j]; } sum1=0; for(i=0;i<n;++i) { for(j=0;j<n;++j) { if(map1[i][j]==‘1‘) { dfs1(i,j); ++sum1; } } } sum2=0; for(i=0;i<n;++i) { for(j=0;j<n;++j) { if(map2[i][j]==‘1‘) { dfs2(i,j); ++sum2; } } } cout<<"Case "<<test++<<": "<<sum1<<" "<<sum2<<endl; cout<<endl; } return 0; }
山东省第一届ACM大学生程序设计竞赛(原题)—I—Balloons,布布扣,bubuko.com
山东省第一届ACM大学生程序设计竞赛(原题)—I—Balloons
原文:http://blog.csdn.net/lttree/article/details/23603413