http://poj.org/problem?id=1164
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 6382 | Accepted: 3610 |
Description
1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # | # # # # # #---#####---#####---#####---# 3 # | | # # # # # #---#########---#####---#---# 4 # # | | | | # # ############################# (Figure 1) # = Wall | = No wall - = No wall
Input
Output
Sample Input
4 7 11 6 11 6 3 10 6 7 9 6 13 5 15 5 1 10 12 7 13 7 5 13 11 10 8 10 12 13
Sample Output
5 9
Source
/** * @author neko01 */ //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <vector> #include <cmath> #include <set> #include <map> using namespace std; typedef long long LL; #define min3(a,b,c) min(a,min(b,c)) #define max3(a,b,c) max(a,max(b,c)) #define pb push_back #define mp(a,b) make_pair(a,b) #define clr(a) memset(a,0,sizeof a) #define clr1(a) memset(a,-1,sizeof a) #define dbg(a) printf("%d\n",a) typedef pair<int,int> pp; const double eps=1e-9; const double pi=acos(-1.0); const int INF=0x3f3f3f3f; const LL inf=(((LL)1)<<61)+5; const int N=55; int a[N][N]; bool vis[N][N]; int ans,num; int n,m; int dir[4][2]={0,-1,-1,0,0,1,1,0}; bool immap(int x,int y) { return x>=0&&y>=0&&x<n&&y<m; } void bfs(int sx,int sy) { vis[sx][sy]=true; queue<pp>q; q.push(mp(sx,sy)); int tmp=0; while(!q.empty()) { pp cur=q.front(); q.pop(); int x=cur.first; int y=cur.second; tmp++; for(int i=0;i<4;i++) { int xx=x+dir[i][0]; int yy=y+dir[i][1]; if(!((1<<i)&a[x][y])&&immap(xx,yy)&&!vis[xx][yy]) { q.push(mp(xx,yy)); vis[xx][yy]=true; } } } if(tmp>ans) ans=tmp; } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) scanf("%d",&a[i][j]); clr(vis); ans=num=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(!vis[i][j]) { bfs(i,j); num++; } } printf("%d\n%d\n",num,ans); } return 0; }
原文:http://blog.csdn.net/neko01/article/details/40227651