廣搜

第一行輸入四個數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);
		
	}

}
相關文章
相關標籤/搜索