HDOJ1241 Oil Deposits

来源:互联网 发布:黑客用函数语言编程 编辑:程序博客网 时间:2024/06/03 07:14


题意:每一个@的九宫格有其他@字符,说明这几个@字符是连通的,每一块不连通的@字符集是一块油田,问有几块?

本题利用BFS广搜,废话不多说,上代码(java):

package cn.hncu.search;import java.util.Scanner;public class SearchBFS {public static void main(String[] args) {Scanner sc=new Scanner(System.in);while(sc.hasNext()){int n=sc.nextInt();int m=sc.nextInt();if(n==0&&m==0)return;Plot[][] plots=new Plot[n][m];for (int i = 0; i < n; i++) {String str=sc.next();for (int j = 0; j < m; j++) {plots[i][j]=new Plot(i, j, str.charAt(j));}}PlotQueue plotQueue=new PlotQueue();//广搜要队列int count=0;for (int i = 0; i < plots.length; i++) {for (int j = 0; j < plots[i].length; j++) {if(plots[i][j].c=='@'&&!plots[i][j].isVisit){plots[i][j].isVisit=true;//符合要求加入队列plotQueue.add(plots[i][j]);//开始广搜bfs(plotQueue,plots);count++;}}}System.out.println(count);}}static int[][] dir={{-1,-1},{0,-1},{1,-1},             {-1,0},        {1,0},             {-1,1}, {0,1},  {1,1}};private static void bfs(PlotQueue plotQueue, Plot[][] plots) {//队列非空while(!plotQueue.isEmpty()){//取出操作数Plot plot=plotQueue.pop();//遍历周围for (int k = 0; k < dir.length; k++) {int i=plot.x+dir[k][0];int j=plot.y+dir[k][1];if(i>=0&&i<plots.length && j>=0&&j<plots[i].length&& plots[i][j].c=='@' && !plots[i][j].isVisit){//符合加入队列plots[i][j].isVisit=true;plotQueue.add(plots[i][j]);}}}}}class Plot{int x,y;char c;boolean isVisit;public Plot(int x, int y, char c) {this.x = x;this.y = y;this.c = c;}Plot child;}class PlotQueue{Plot first;//头结点Plot end;//尾节点public void add(Plot p){if(first==null){//队列为空时//头尾皆指第一个end=p;first=p;}else{end.child=p;//将新加入的加入队列,end=p;//使尾指针更新}}public Plot pop(){if(first!=null){//头指针不为空及 队列不空Plot p=first;//确定排除的节点first=first.child;//更新头指针return p;}return null;}public boolean isEmpty(){if(first==null)//头指针为空及 队列空return true;return false;}}


0 0
原创粉丝点击