P1030 乳草的入侵
时间: 1000ms / 空间: 131072KiB / Java类名: Main

背景

USACO OCT09 6TH

描述

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星期后佔领整片土地。

输入格式

* 第一行: 四个由空格隔开的整数: X, Y, Mx, My

* 第2到第Y+1行: 数据的第y+1行由X个字符("."表示草地,"*"表示大石),描述草地的
第(Y+2-y)行。

输出格式

* 第一行: 一个单独的整数表示最后一个不是大石块的格子被乳草佔领的星期数。

测试样例1

输入

输出

 

宽搜(教程:http://rapheal.iteye.com/blog/1526861  感觉图配上蛮好理解的)
//这题坐标无比奇怪啊
给你一张图,

一开始要么是平地要么是石头
突然乳草进来啦
乳草每分钟会扩张到八联通的平地上(石头上不长)
求最快多少分钟整张地图除了石头就是乳草
保证数据合法
#include <iostream>
#include <stdio.h>
#define inf 233333333
using namespace std;
const int Maxn = ;
const int Maxq = ;
int n , m , x , y , ch;
int mp[Maxn][Maxn];//´æÒ»¸öµã×î¿ì±»²ÝÕ¼ÁìµÄʱ¼ä£¬-1±íʾÊÇʯͷ
int qx[Maxq] , qy[Maxq] , qt[Maxq];//´æ¶ÓÁÐ
int h , t;//¶ÓÁеĿªÊ¼/½áβ
bool vis[Maxn][Maxn];//ÓÉÓÚÊÇbfsËùÒÔµ½Ò»¸öµã¿Ï¶¨ÊÇ×î¶Ì·
const int ss[][] = { { , , - , , , , - , - } , { , , , - , , - , , - } };//°ËÁªÍ¨
int main() {
cin>>m>>n>>y>>x;
for(int i=; i<=n; ++i)
for(int j=; j<=m; ++j) {
while(ch = getchar() , ch != '.' && ch !='*');//while(¶ÁÈëÒ»¸ö×Ö·û , Èç¹ûÄǸö×Ö·û²»ÊÇ'.'»òÕß'*'¾ÍÒ»Ö±¶Á );
if(ch == '.')
mp[i][j] = inf;
else
mp[i][j] = -;
}
/*ÒÔÉÏΪ³õʼ»¯*/
qx[h = t = ] = n-x+;
qy[] = y;
qt[] = ;
while(h <= t) {
int nx = qx[h] , ny = qy[h] , nt = qt[h];
h++;
if(vis[nx][ny]) continue;//Èç¹û·ÃÎʹý¾Ícontinue
if(mp[nx][ny] == -) continue;//Èç¹ûÊÇʯͷ¾Ícontinue
vis[nx][ny] = ;//±ê¼ÇΪ×ß¹ý
mp[nx][ny] = nt;//¼Ç¼×ßµ½Õâ¸öµãµÄʱ¼ä
for(int i=; i<; ++i) {
int x = nx+ss[][i] , y = ny+ss[][i];
if(x <= || x > n || y <= || y > m) continue;//Èç¹û°ËÁªÍ¨ºÏ·¨¾Í¶ª½ø¶Ó
qx[++t] = x;
qy[t] = y;
qt[t] = nt + ;
}
}
/*ÒÔÉÏΪbfs*/
int ans = ;
for(int i=; i<=n; ++i) {
for(int j=; j<=m; ++j) {
//cout<<mp[i][j]<<"\t";
ans = max(ans , mp[i][j]);
}//puts("")
}
/*ÒÔÉÏΪͳ¼Æ´ð°¸*/
cout<<ans;
}

zls

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std;
int mx,my,n,m;
int ans=;
char a[][];
int f[][];
int head,tail=,qx[],qy[];
int xx[]={-,,,,-,,-,};
int yy[]={,,-,,-,,,-}; void bfs()
{
qx[]=mx,qy[]=my;
f[mx][my]=;
while(head!=tail)
{
int x=qx[head],y=qy[head];head++;
ans=f[x][y];
for(int i=;i<;i++)
{
int dx=x+xx[i],dy=y+yy[i];
if(dx<||dy<||dx>m||dy>n||a[dx][dy]=='*'||f[dx][dy]!=-)continue;
f[dx][dy]=f[x][y]+;
qx[tail]=dx;qy[tail]=dy;tail++;
}
} }
int main()
{
cin>>n>>m>>my>>mx;//m hang n lie
memset(f,-,sizeof(f));
for(int i=m;i>;i--)scanf("%s",a[i]+);
bfs();
cout<<ans;
puts(""); return ;
}

//不看清坐标毁一生

 
 
04-27 05:27