vijos P1051 送给圣诞夜的极光
2015-11-14 19:03
387 查看
调了好久。。。
#include <cstdio>
#include <queue>
using namespace std;
char a[110*110];
/**************************************
000000000000
000000000000
00----####00
00###----#00 //like dis
00##--##--00
000000000000
000000000000
**************************************/
int visited[110*110];
int cnt;
int of1x[] = {-1, 0, 1, 0};
int of1y[] = {0, -1, 0, 1};
int of2x[] = {0, 1, 2, 1, 0, -1, -2, -1};
int of2y[] = {2, 1, 0, -1, -2, -1, 0, 1};
int main(){
int m, n;
scanf("%d%d", &m, &n);
getchar();
for(int i = 2; i < m+2; ++i){
for(int j = 2; j < n+2; ++j){
a[i*(n+4)+j] = getchar();
}
getchar();
}
n = n+4;
queue<int> Q;
for(int i = 0; i < (m+4)*n-1; ++i){
if(!visited[i] && a[i] == '#'){
int now = i;
visited[now] = 2;
cnt++;
Q.push(now);
do{
//搜索附近
now = Q.front();
Q.pop();
int x = now%n;
int y = now/n;
if(visited[now] == 2){ //now是第二圈
for(int ii = 0; ii < 4; ++ii){
int pos = (y+of1y[ii])*n + (x+of1x[ii]);
if(!visited[pos] && a[pos] == '#'){
visited[pos] = 1;
Q.push(pos);
}
}
}
for(int ii = 0; ii < 8; ++ii){
int pos = (y+of2y[ii])*n + (x+of2x[ii]);
if(!visited[pos] && a[pos] == '#'){
visited[pos] = 2;
Q.push(pos);
}
}
}while(!Q.empty());
}
}
printf("%d", cnt);
return 0;
}
#include <cstdio>
#include <queue>
using namespace std;
char a[110*110];
/**************************************
000000000000
000000000000
00----####00
00###----#00 //like dis
00##--##--00
000000000000
000000000000
**************************************/
int visited[110*110];
int cnt;
int of1x[] = {-1, 0, 1, 0};
int of1y[] = {0, -1, 0, 1};
int of2x[] = {0, 1, 2, 1, 0, -1, -2, -1};
int of2y[] = {2, 1, 0, -1, -2, -1, 0, 1};
int main(){
int m, n;
scanf("%d%d", &m, &n);
getchar();
for(int i = 2; i < m+2; ++i){
for(int j = 2; j < n+2; ++j){
a[i*(n+4)+j] = getchar();
}
getchar();
}
n = n+4;
queue<int> Q;
for(int i = 0; i < (m+4)*n-1; ++i){
if(!visited[i] && a[i] == '#'){
int now = i;
visited[now] = 2;
cnt++;
Q.push(now);
do{
//搜索附近
now = Q.front();
Q.pop();
int x = now%n;
int y = now/n;
if(visited[now] == 2){ //now是第二圈
for(int ii = 0; ii < 4; ++ii){
int pos = (y+of1y[ii])*n + (x+of1x[ii]);
if(!visited[pos] && a[pos] == '#'){
visited[pos] = 1;
Q.push(pos);
}
}
}
for(int ii = 0; ii < 8; ++ii){
int pos = (y+of2y[ii])*n + (x+of2x[ii]);
if(!visited[pos] && a[pos] == '#'){
visited[pos] = 2;
Q.push(pos);
}
}
}while(!Q.empty());
}
}
printf("%d", cnt);
return 0;
}
相关文章推荐
- VIJOS P1040 高精度乘法
- VIJOS P1000 A+B Problem
- vijos1057
- Vijos P1775 乌龟棋 题解
- Vijos P1133 装箱问题 题解
- Vijos P1098 合唱队形题解
- vijos P1059积木城堡
- vijos P1071新年趣事之打牌
- 【vijos】P1016北京2008的挂钟
- 【vijos】P1082丛林探险DFS+剪枝版本
- 【P1843】货车运输(最大生成树+LCA)
- 【P1738】NOIP2011Mayan游戏C++题解(搜索)
- Vijos P1002 过河 (NOIP提高组2005)
- 【基础练习】【强连通tarjan】vijos1021-1023 Victoria的舞会系列题解
- vijos P1196 吃糖果游戏
- vijos P1007 绕钉子的长绳子
- [Vijos] P1151 - 失落的成绩单
- Vijos 1943 上学路上 容斥+组合数+逆元法
- vijos-P1083 小白逛公园
- VIJOS-P1359 Superprime