TYVJ 1030 乳草的入侵(BFS)
背景 Background
USACO OCT09 6TH
描述 Description
Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草。可惜天不从人愿,他在植物大战人类中败下阵来。邪恶的乳草已经在他的农场的西北部份佔领了一片立足之地。
草地像往常一样,被分割成一个高度為Y(1 <= y <= 100), 宽度為X(1 <= x <= 100)的直角网格。(1,1)是左下角的格(也就是说坐标排布跟一般的X,Y坐标相同)。乳草一开始佔领了格(Mx,My)。每个星期,乳草传播到已被乳草佔领的格子四面八方的每一个没有很多石头的格(包括垂直与水平相邻的和对角线上相邻的格)。1周之后,这些新佔领的格又可以把乳草传播到更多的格裡面了。
Bessie想要在草地被乳草完全佔领之前尽可能的享用所有的牧草。她很好奇到底乳草要多久才能佔领整个草地。如果乳草在0时刻处於格(Mx,My),那麼还在那个时刻它们可以完全佔领入侵整片草地呢(对给定的数据总是会发生)?
草地由一个图片表示。"."表示草,而"*"表示大石。比如这个X=4, Y=3的例子。
....
..*.
.**.
如果乳草一开始在左下角(第1排,第1列),那麼草地的地图将会以如下态势发展:
.... .... MMM. MMMM MMMM
..*. MM*. MM*. MM*M MM*M
M**. M**. M**. M**. M**M
星期数 0 1 2 3 4
乳草会在4星期后佔领整片土地。
草地像往常一样,被分割成一个高度為Y(1 <= y <= 100), 宽度為X(1 <= x <= 100)的直角网格。(1,1)是左下角的格(也就是说坐标排布跟一般的X,Y坐标相同)。乳草一开始佔领了格(Mx,My)。每个星期,乳草传播到已被乳草佔领的格子四面八方的每一个没有很多石头的格(包括垂直与水平相邻的和对角线上相邻的格)。1周之后,这些新佔领的格又可以把乳草传播到更多的格裡面了。
Bessie想要在草地被乳草完全佔领之前尽可能的享用所有的牧草。她很好奇到底乳草要多久才能佔领整个草地。如果乳草在0时刻处於格(Mx,My),那麼还在那个时刻它们可以完全佔领入侵整片草地呢(对给定的数据总是会发生)?
草地由一个图片表示。"."表示草,而"*"表示大石。比如这个X=4, Y=3的例子。
....
..*.
.**.
如果乳草一开始在左下角(第1排,第1列),那麼草地的地图将会以如下态势发展:
.... .... MMM. MMMM MMMM
..*. MM*. MM*. MM*M MM*M
M**. M**. M**. M**. M**M
星期数 0 1 2 3 4
乳草会在4星期后佔领整片土地。
输入格式 InputFormat
* 第一行: 四个由空格隔开的整数: X, Y, Mx, My
* 第2到第Y+1行: 数据的第y+1行由X个字符("."表示草地,"*"表示大石),描述草地的
第(Y+2-y)行。
* 第2到第Y+1行: 数据的第y+1行由X个字符("."表示草地,"*"表示大石),描述草地的
第(Y+2-y)行。
输出格式 OutputFormat
* 第一行: 一个单独的整数表示最后一个不是大石块的格子被乳草佔领的星期数。
样例输入 SampleInput
4 3 1 1
....
..*.
.**.
样例输出 SampleOutput
4
这道题思路就是BFS,注意输入,先输入列后输入行。
一开始的想法是判断是否所有的路都被乳草占领了,如果全部全部被占领了,输出结果。(这里输出哪一个星期的时候要输出next.step,因为你是把节点扩展之后判断的,意思就是说,你下个星期会不会被全部占领)
1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 #include<stdlib.h> 5 using namespace std; 6 char a[105][105]; 7 int vis[105][105]; 8 int dir[8][2]={{-1,0},{0,1},{1,0},{0,-1},{-1,1},{1,1},{1,-1},{-1,-1}}; 9 int n,m,sx,sy,day,cnt,sum,num; 10 struct node 11 { 12 int x,y; 13 int step; 14 }star; 15 void BFS() 16 { 17 memset(vis,0,sizeof(vis)); 18 star.x=sx; 19 star.y=sy; 20 star.step=0; 21 queue<node> q; 22 q.push(star); 23 vis[star.x][star.y]=1; 24 while(!q.empty()) 25 { 26 node now,next; 27 now=q.front(); 28 q.pop(); 29 for(int i=0;i<8;i++) 30 { 31 next.x=now.x+dir[i][0]; 32 next.y=now.y+dir[i][1]; 33 if(0<=next.x&&next.x<n&&0<=next.y&&next.y<m&&!vis[next.x][next.y]&&a[next.x][next.y]!='*') 34 { 35 next.step=now.step+1; 36 q.push(next); 37 vis[next.x][next.y]=1; 38 cnt++; 39 } 40 } 41 if(cnt==sum) 42 { 43 printf("%d\n",next.step); 44 return ; 45 } 46 } 47 return ; 48 } 49 int main() 50 { 51 day=0,cnt=1,num=0; 52 scanf("%d %d %d %d",&m,&n,&sy,&sx); 53 for(int i=0;i<n;i++) 54 scanf("%s",a[i]); 55 star.x=sx--; 56 star.y=sy--; 57 for(int i=0;i<n;i++) 58 for(int j=0;j<m;j++) 59 if(a[i][j]=='*') 60 num++; 61 62 sum=n*m-num; 63 BFS(); 64 //printf("%d %d\n",sum,num); 65 // printf("%d\n",day); 66 //printf("%d\n",cnt); 67 return 0; 68 }
后来发现另外一种记录第几个星期的方法
1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 #include<stdlib.h> 5 using namespace std; 6 char a[105][105]; 7 int vis[105][105]; 8 int dir[8][2]={{-1,0},{0,1},{1,0},{0,-1},{-1,1},{1,1},{1,-1},{-1,-1}}; 9 int n,m,sx,sy,day; 10 struct node 11 { 12 int x,y; 13 int step; 14 }star; 15 void BFS() 16 { 17 memset(vis,0,sizeof(vis)); 18 star.x=sx; 19 star.y=sy; 20 star.step=0; 21 queue<node> q; 22 q.push(star); 23 vis[star.x][star.y]=1; 24 while(!q.empty()) 25 { 26 node now,next; 27 now=q.front(); 28 q.pop(); 29 for(int i=0;i<8;i++) 30 { 31 next.x=now.x+dir[i][0]; 32 next.y=now.y+dir[i][1]; 33 if(0<=next.x&&next.x<n&&0<=next.y&&next.y<m&&!vis[next.x][next.y]&&a[next.x][next.y]!='*') 34 { 35 next.step=now.step+1; 36 q.push(next); 37 vis[next.x][next.y]=1; 38 if(day<next.step) 39 day=next.step; 40 } 41 } 42 } 43 return ; 44 } 45 int main() 46 { 47 day=0; 48 scanf("%d %d %d %d",&m,&n,&sy,&sx); 49 for(int i=0;i<n;i++) 50 scanf("%s",a[i]); 51 star.x=sx--; 52 star.y=sy--; 53 BFS(); 54 printf("%d\n",day); 55 return 0; 56 }