现在的位置: 首页 > 综合 > 正文

hdu1312基础的搜索

2013年10月14日 ⁄ 综合 ⁄ 共 2788字 ⁄ 字号 评论关闭


DFS的两种实现:

import java.util.Scanner;

public class hdu1312DFS {

	static char map[][]=new char[22][22];
	static int x,y;
	static int inc[][]={{1,0},{0,1},{-1,0},{0,-1}};
	static int ans;
	static void init()
	{
		Scanner in=new Scanner(System.in);
		while(true)
		{
			y=in.nextInt();
			x=in.nextInt();
			if(x==0&&y==0)
				break;
			int a=-1,b=-1;
			for(int i=1;i<=x;i++)
			{
				String data=in.next();
				for(int j=1;j<=y;j++)
				{
					map[i][j]=data.charAt(j-1);
					if(map[i][j]=='@')
					{
						a=i;
						b=j;
					}
				}
			}
			ans=0;
			DFS1(a,b);
			System.out.println(ans);
		}
		
	}
	
	static void DFS(int a,int b)
	{
		if(map[a][b]=='#'||a<1||b<1||a>x||b>y)
			return;
		if(map[a][b]=='.')
		{
			ans++;
			map[a][b]='#';
		}
		
		for(int i=0;i<4;i++)
		{
			int x=a+inc[i][0];
			int y=b+inc[i][1];
			DFS(x,y);
			
		}
	}
	
	static void DFS1(int a,int b)
	{
		if(map[a][b]=='#'||a<1||b<1||a>x||b>y)
			return;
		else
		{
			ans++;
			map[a][b]='#';
			DFS1(a+1,b);
			DFS1(a,b+1);
			DFS1(a-1,b);
			DFS1(a,b-1);
		}
	}
	
	
	public static void main(String[] args) {
		init();
	}
}

BFS的实现:

import java.util.ArrayList;
import java.util.Scanner;

//BFS实现
public class hdu1312BFS {

	static int inc[][]={{1,0},{0,1},{-1,0},{0,-1}};
	static char map[][]=new char[110][110];
	static int x,y;
	class Node
	{
		int x;
		int y;
		
	}
	static int ans;
	void build()
	{
		Scanner in=new Scanner(System.in);
		while(true)
		{
			y=in.nextInt();
			x=in.nextInt();
			if(x==0&&y==0)
				break;
			int a=-1,b=-1;
			ans=1;
			for(int i=1;i<=x;i++)
			{
				String line=in.next();
				for(int j=1;j<=y;j++)
				{
					map[i][j]=line.charAt(j-1);
					if(map[i][j]=='@')
					{
						a=i;
						b=j;
					}
				}
			}
			BFS(a,b);
			
		}
	}
	 void BFS(int a,int b)
	{
		ArrayList<Node> q=new ArrayList<Node>() ;
		Node cur=new Node();
		Node next;
		cur.x=a;
		cur.y=b;
		map[a][b]='#';
		q.add(cur);
		while(!q.isEmpty())
		{
			cur=q.get(0);
			for(int i=0;i<4;i++)
			{
				next=new Node();
				next.x=cur.x+inc[i][0];
				next.y=cur.y+inc[i][1];
				if(next.y<=y&&next.x<=x&&next.x>=1&&next.y>=1&&map[next.x][next.y]=='.')
				{
					ans++;
					map[next.x][next.y]='#';
					q.add(next);
				}
				
			}
			q.remove(cur);
		}
		System.out.println(ans);
		
	}
	
	public static void main(String[] args) {
		new hdu1312BFS().build();
	}
}

再贴一个cpp的:

//============================================================================
// Name        : hdu1312BFS.cpp
// Author      : xinge
// Version     :
// Copyright   : Your copyright notice
// Description : Ansi-style
//============================================================================

#include <iostream>
#include <cstring>
#include <cstdio>
#include <math.h>
#include <stdio.h>
#include <algorithm>
#include<cmath>
#include<queue>
using namespace std;
//BFS

char map[110][110];
int xx,yy,ans;
int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
struct Node
{
	int x,y;
};

void BFS(int a,int b)
{
	queue<Node> q;
	Node cur,next;
	cur.x=a;
	cur.y=b;
	q.push(cur);
	map[a][b]='#';
	while(!q.empty())
	{
			cur=q.front();
			q.pop();
		for(int i=0;i<4;i++)
		{
			next.x=cur.x+dir[i][0];
			next.y=cur.y+dir[i][1];
			if(next.x<xx&&next.y<yy&&next.x>=0&&next.y>=0&&map[next.x][next.y]=='.')
			{
				ans++;
				map[next.x][next.y]='#';
				q.push(next);
			}
		}

	}
	printf("%d\n",ans);
}

int main() {
	while(~scanf("%d%d",&yy,&xx))
		{
			if(xx==0&&yy==0)
				break;
			int i,j,a=-1,b=-1;
			ans=1;
			for(i=0;i<xx;i++)
				scanf("%s",&map[i]);
			for(i=0;i<xx;i++)
				for(j=0;j<yy;j++)
				{
					if(map[i][j]=='@')
					{
						a=i;
						b=j;
						BFS(a,b);
					}
				}
		}
	return 0;
}


抱歉!评论已关闭.