青蛙

题目描述 

有一只可爱的老青蛙,在路的另一端发现了一个黑的东西,想过去一探究竟。于是便开始踏上了旅途

一直这个小路上有很多的隧道,从隧道的a进入,会从b出来,但是隧道不可以反向走。

这只青蛙因为太老了,所以很懒,现在想请你帮帮慢,问他最少需要几步才可以到达对面。

将小径看作一条数轴,青蛙初始在0上,这只青蛙可以向前跳也可以向后跳,但每次只能跳一格,每跳一格记作一步,从隧道进到隧道出算做一步。

输入描述:

第一行两个数m,n;表示黑色物品在数轴m点上,数轴上总共有n个隧道
接下来n行,每行a,b两个数,表示从a进会从b出

10 <= m,n <= 233

0<a,b<=m

输出描述:

一个数ans表示最小步数

示例1

输入

复制

16 4
2 10
8 15
12 5
13 6

输出

复制

7

说明

 

0-->1-->2-->10-->9-->8-->15-->16

 

import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.InputStream;

class Node {
	int t;
	int sum=0;
	Node(int t,int sum){
		this.t = t;
		this.sum=sum;
	}
	
}

public class Main {
	
    public static void main(String[] args) throws FileNotFoundException {
//    	File file1 = new File("C:/Users/hasee/Desktop/tree.in");
//    	File file2 = new File("C:/Users/hasee/Desktop/2.txt");
//    	InputStream inputStream = new FileInputStream(file1);
//    	OutputStream outputStream = new FileOutputStream(file2);
    	InputStream inputStream = System.in;
    	OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        PrintWriter out = new PrintWriter(outputStream);
        TaskA solver = new TaskA();
        solver.solve(1, in, out);
        out.close();
    }
    
    static class TaskA {
    	
    	static ArrayList<String> list;
    	
        public void solve(int testNumber, InputReader in, PrintWriter out) {
        	
        	int a=in.nextInt();
        	int b=in.nextInt();
        	int x[] = new int[a+1];
        	x[0] = 0;
        	for(int n=0;n<b;n++){
        		int a1=in.nextInt();
        		int a2=in.nextInt();
        		x[a1] = a2;
        	}
        	int t[] = new int[a+1];
        	Queue<Node> q = new LinkedList<Node>();
        	Node node = new Node(0,0);
        	q.add(node);
        	t[0]=1;
        	while(!q.isEmpty()){
        		node = q.poll();
        		
        		if(node.t==a){
        			System.out.println(node.sum);
        			break;
        		}
        		if(node.t-1>=0&&t[node.t-1]==0){
        			t[node.t-1]=1;
        			Node nod = new Node(node.t-1,node.sum+1);
        			q.add(nod);
        		}
        		if(node.t+1<=a&&t[node.t+1]==0){
        			t[node.t+1]=1;
        			Node nod = new Node(node.t+1,node.sum+1);
        			q.add(nod);
        		}
        		if(x[node.t]!=0&&t[x[node.t]]==0){
        			t[x[node.t]]=1;
        			Node nod = new Node(x[node.t],node.sum+1);
        			q.add(nod);
        		}
        		
        	}
        	
        }
        

        
    }

    static class InputReader {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public InputReader(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }
        
        public double nextDouble() {
        	return Double.parseDouble(next());
        }

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值