花花生米

导航

广搜

第一行输入四个数n m sx sy,分别表示n行m列,起始点sx,sy,在n行m列中,有0-9的数字,0代表不能走,其余任何数字都可以走,求从起始点上下左右相邻点依次延申能够到达多少个点。

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class G宝岛探险 {
	static int [][]vis=new int [51][51];
	static int [][]map=new int [51][51];
	static int []dx= {1,0,-1,0};
	static int []dy= {0,1,0,-1};
	static int sum=0;static int n=0;
	static int m=0;static int sx;static int sy;
	static Queue<Integer>qx=new LinkedList<Integer>();
	static Queue<Integer>qy=new LinkedList<Integer>();
	static Scanner in=new Scanner (System.in);
	
	
	public static boolean inmap(int x,int y)
	{
		return(x>=1&&x<=n&&y>=1&&y<=m);
	}
	public static void bfs(int x,int y)
	{
		while(!qx.isEmpty())
		{
			for(int i=0;i<4;i++)
			{
				int xx=qx.peek()+dx[i];
				int yy=qy.peek()+dy[i];
				if(inmap(xx,yy)&&vis[xx][yy]!=1&&map[xx][yy]!=0)
				{
					sum++;
					vis[xx][yy]=1;
					qx.offer(xx);
					qy.offer(yy);
				}
			}
			qx.poll();
			qy.poll();
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 n=in.nextInt(); m=in.nextInt();
		 sx=in.nextInt();sy=in.nextInt();
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				map[i][j]=in.nextInt();
			}
		}
		qx.offer(sx);
		qy.offer(sy);
		sum=1;
		vis[sx][sy]=1;
		bfs(sx,sy);
		System.out.println(sum);
		
	}

}

posted on 2020-04-06 21:24  花花生米  阅读(177)  评论(0编辑  收藏  举报