Time Limit: 20 Sec Memory Limit: 256 MB
题目连接
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=601&pid=1003
Description
百小度最近迷恋上了一款游戏,游戏里有一个n*m的棋盘,每个方格代表一个城池。 一开始的时候我们有g支军队,驻扎并占领了其中某些城池。然后我们可以在这些被占领城池的基础上,吞并占领周围的城池。
而其吞并占领的规则是这样的——一旦一个城池A相邻的上下左右四个城池中至少存在两个被占领,且这两个被占领的城池有公共点,那么城池A也将被占领。 比如我们用1表示初始的占领状态,0表示初始的未占领状态。 那么——
10 01会最终会变成
11 11而101则保持为101不变 现在告诉你一张地图一开始所有被占领城池的信息,问你最后多少个城池会被我们占领。
Input
下面T组数据,对于每组数据, 第一行是两个数n,m(1≤n,m≤500),表示国土的大小为n*m。
第二行是一个整数g(1≤g≤1000),表示我们一开始占领的城池数。 然后跟随g行,第i行一对整数x,y(1≤x≤n,1≤y≤m),表示占领的第i个城池的坐标。
Output
对第i组数据,输出
Case #i:
然后输出一行,仅包含一个整数,表示最终有多少个城池被占领。
Sample Input
4 2 2 2 1 1 2 2 3 3 3 1 1 2 3 3 2 2 4 5 1 1 1 1 1 2 1 3 1 4 2 4 2 1 1 2 4
Sample Output
Case #1: 4 Case #2: 9 Case #3: 4 Case #4: 2
HINT
题意
题解:
直接暴力修改就好,这份代码是kuangbin的,我看不了我的代码 = =
我是dfs修改的,和某次cf的题很类似
代码:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; bool f[550][550]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T; int n,m; int iCase = 0; scanf("%d",&T); while(T--){ iCase++; scanf("%d%d",&n,&m); memset(f,false,sizeof(f)); int x,y; int g; scanf("%d",&g); while(g--){ scanf("%d%d",&x,&y); x--; y--; f[x][y] = true; } while(1){ bool add = false; for(int i = 0;i < n;i++) for(int j = 0;j < m;j++){ if(f[i][j])continue; if(i > 0 && j < m-1 && f[i-1][j] && f[i][j+1]){ f[i][j] = true; add = true; continue; } if(i > 0 && j > 0 && f[i-1][j] && f[i][j-1]){ f[i][j] = true; add = true; continue; } if(i < n-1 && j > 0 && f[i+1][j] && f[i][j-1]){ f[i][j] = true; add = true; continue; } if(i < n-1 && j < m-1 && f[i+1][j] && f[i][j+1]){ f[i][j] = true; add = true; continue; } } if(!add)break; } int ans = 0; for(int i = 0;i < n;i++) for(int j = 0;j < m;j++) ans += f[i][j]; printf("Case #%d:\n%d\n",iCase,ans); } return 0; }