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

DFS实现坦克大战

2013年03月10日 ⁄ 综合 ⁄ 共 1759字 ⁄ 字号 评论关闭

对于每个位置,判断到达的步数是不是更小,大了就不处理,方法比较笨,不过也算是做出来了

 

import java.util.*;
public class Main {
	
	Scanner sc=new Scanner(System.in);
	int[][] array;
	char[][] car;
	int n=0;
	int m=0;
	int b;
	int e;
	public void init()
	{
		while((n=sc.nextInt())!=0|(m=sc.nextInt())!=0)
		{			
			car=new char[n][m];
			array=new int[n][m];
			
			b=0;
			e=0;
			for(int i=0;i<n;i++)
			{
				String s=sc.next();
				if(s.indexOf('Y')!=-1)
				{
					b=i*m+s.indexOf('Y');
				}
				if(s.indexOf('T')!=-1)
				{
					e=i*m+s.indexOf('T');
				}
				car[i]=s.toCharArray();
				Arrays.fill(array[i], 310);	
			}
				
			array[b/m][b%m]=0;
			fun(b);
			if(array[e/m][e%m]==310)
			{
				System.out.println("-1");
			}
			else
			{
				System.out.println(array[e/m][e%m]);
			}
		}
		
	}
	
	public void fun(int index)
	{
		if(index==e)
		{
			return;
		}
		int i=index/m;
		int j=index%m;
		
		if(i-1>=0)
		{
			if(car[i-1][j]!='S'&&car[i-1][j]!='R')
			{
				if(car[i-1][j]=='E'||car[i-1][j]=='T')
				{
					if(array[i][j]+1<array[i-1][j])
					{
						array[i-1][j]=array[i][j]+1;
						fun((i-1)*m+j);
					}
				}
				if(car[i-1][j]=='B')
				{
					if(array[i][j]+2<array[i-1][j])
					{
						array[i-1][j]=array[i][j]+2;
						fun((i-1)*m+j);
					}
				}
				
			}
		}
		if(i+1<n)
		{
			if(car[i+1][j]!='S'&&car[i+1][j]!='R')
			{
				if(car[i+1][j]=='E'||car[i+1][j]=='T')
				{
					if(array[i][j]+1<array[i+1][j])
					{
						array[i+1][j]=array[i][j]+1;
						
						fun((i+1)*m+j);
					}
				}
				if(car[i+1][j]=='B')
				{
					if(array[i][j]+2<array[i+1][j])
					{
						array[i+1][j]=array[i][j]+2;
						fun((i+1)*m+j);
					}
				}
			}
		}
		if(j-1>=0)
		{
			if(car[i][j-1]!='S'&&car[i][j-1]!='R')
			{
				if(car[i][j-1]=='E'||car[i][j-1]=='T')
				{
					if(array[i][j]+1<array[i][j-1])
					{
						array[i][j-1]=array[i][j]+1;
						fun(i*m+j-1);
					}
				}
				if(car[i][j-1]=='B')
				{
					if(array[i][j]+2<array[i][j-1])
					{
						array[i][j-1]=array[i][j]+2;
						fun(i*m+j-1);
					}
				}
			}
		}
		if(j+1<m)
		{
			if(car[i][j+1]!='S'&&car[i][j+1]!='R')
			{
				if(car[i][j+1]=='E'||car[i][j+1]=='T')
				{
					
					if(array[i][j]+1<array[i][j+1])
					{
						array[i][j+1]=array[i][j]+1;						
						fun(i*m+j+1);
					}
				}
				if(car[i][j+1]=='B')
				{
					
					if(array[i][j]+2<array[i][j+1])
					{
						array[i][j+1]=array[i][j]+2;						
						fun(i*m+j+1);
					}
				}
			}
		}
	}
	
	public static void main(String[] args) {
		// TODO 自动生成方法存根
		new Main().init();
	}

}
        

抱歉!评论已关闭.