• [topcoder]SmartWordToy


    广度搜索BFS,要用Queue。还不是很熟,这道题帮助理清一些思绪了。其实这道题是求最短路径,所以BFS遇到第一个就可以返回了,所以后面有些现有大小和历史大小的判断可以省却。

    过程中拿数组存step还是很有用的。其他的解法中我看到有把四位char编码返回整数的a*26*26*26+b*26*26+c*26+d,很不错,本质就是26进制的数。

    import java.util.*;
    
    public class SmartWordToy
    {
    	public int minPresses(String start, String finish, String[] forbid) {
    		int[][][][] step = new int[26][26][26][26];
    		int[][][][] forb = new int[26][26][26][26];
    		for (int a = 0; a < 26; a++)
    		for (int b = 0; b < 26; b++)
    		for (int c = 0; c < 26; c++)
    		for (int d = 0; d < 26; d++)
    		{
    			step[a][b][c][d] = -1;
    			forb[a][b][c][d] = 0;
    		}
    		
    		for (int i = 0; i < forbid.length; i++) {
    			String[] lines = forbid[i].split(" ");
    			for (int a = 0; a < lines[0].length(); a++) {
    				for (int b = 0; b < lines[1].length(); b++) {
    					for (int c = 0; c < lines[2].length(); c++) {
    						for (int d = 0; d < lines[3].length(); d++) {
    							forb[lines[0].charAt(a)-'a'][lines[1].charAt(b)-'a'][lines[2].charAt(c)-'a'][lines[3].charAt(d)-'a'] = 1;
    						}
    					}
    				}
    			}
    		}
    		
    		LinkedList<Word> queue = new LinkedList<Word>();
    		Word sw = new Word(start.charAt(0), start.charAt(1), start.charAt(2), start.charAt(3));
    		step[sw.a-'a'][sw.b-'a'][sw.c-'a'][sw.d-'a'] = 0;
    		queue.offer(sw);
    		
    		Word fw = new Word(finish.charAt(0), finish.charAt(1), finish.charAt(2), finish.charAt(3));
    
    		while (queue.size() != 0) {
    			Word w = queue.poll();
    			int cur_step = step[w.a-'a'][w.b-'a'][w.c-'a'][w.d-'a'];
    			if (w.a == fw.a && w.b == fw.b && w.c == fw.c && w.d == fw.d) return cur_step;
    			
    			Word tmp = new Word();
    			tmp.a = next(w.a); tmp.b = w.b; tmp.c = w.c; tmp.d = w.d;
    			int tmp_step = step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'];
    			if (forb[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] == 0 && (tmp_step == -1 || tmp_step > cur_step+1)) {
    				step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] = cur_step + 1;
    				queue.offer(tmp);
    			}
    			tmp = new Word();
    			tmp.a = prev(w.a); tmp.b = w.b; tmp.c = w.c; tmp.d = w.d;
    			tmp_step = step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'];
    			if (forb[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] == 0 && (tmp_step == -1 || tmp_step > cur_step+1)) {
    				step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] = cur_step + 1;
    				queue.offer(tmp);
    			}
    			tmp = new Word();
    			tmp.a = w.a; tmp.b = next(w.b); tmp.c = w.c; tmp.d = w.d;
    			tmp_step = step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'];
    			if (forb[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] == 0 && (tmp_step == -1 || tmp_step > cur_step+1)) {
    				step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] = cur_step + 1;
    				queue.offer(tmp);
    			}
    			tmp = new Word();
    			tmp.a = w.a; tmp.b = prev(w.b); tmp.c = w.c; tmp.d = w.d;
    			tmp_step = step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'];
    			if (forb[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] == 0 && (tmp_step == -1 || tmp_step > cur_step+1)) {
    				step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] = cur_step + 1;
    				queue.offer(tmp);
    			}
    			tmp = new Word();
    			tmp.a = w.a; tmp.b = w.b; tmp.c = next(w.c); tmp.d = w.d;
    			tmp_step = step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'];
    			if (forb[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] == 0 && (tmp_step == -1 || tmp_step > cur_step+1)) {
    				step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] = cur_step + 1;
    				queue.offer(tmp);
    			}
    			tmp = new Word();
    			tmp.a = w.a; tmp.b = w.b; tmp.c = prev(w.c); tmp.d = w.d;
    			tmp_step = step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'];
    			if (forb[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] == 0 && (tmp_step == -1 || tmp_step > cur_step+1)) {
    				step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] = cur_step + 1;
    				queue.offer(tmp);
    			}
    			tmp = new Word();
    			tmp.a = w.a; tmp.b = w.b; tmp.c = w.c; tmp.d = next(w.d);
    			tmp_step = step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'];
    			if (forb[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] == 0 && (tmp_step == -1 || tmp_step > cur_step+1)) {
    				step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] = cur_step + 1;
    				queue.offer(tmp);
    			}
    			tmp = new Word();
    			tmp.a = w.a; tmp.b = w.b; tmp.c = w.c; tmp.d = prev(w.d);
    			tmp_step = step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'];
    			if (forb[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] == 0 && (tmp_step == -1 || tmp_step > cur_step+1)) {
    				step[tmp.a-'a'][tmp.b-'a'][tmp.c-'a'][tmp.d-'a'] = cur_step + 1;
    				queue.offer(tmp);
    			}
    		}
    		return step[finish.charAt(0)-'a'][finish.charAt(1)-'a'][finish.charAt(2)-'a'][finish.charAt(3)-'a'];
    	}
    	
    	private char next(char c) {
    		if (c == 'z') return 'a';
    		else return (char)(c+1);
    	}
    	
    	private char prev(char c) {
    		if (c == 'a') return 'z';
    		else return (char)(c-1);
    	}
    }
    
    class Word
    {
    	char a;
    	char b;
    	char c;
    	char d;
    	
    	public Word(char _a, char _b, char _c, char _d) {
    		a = _a; b = _b; c = _c; d = _d;
    	}
    	
    	public Word() {}
    }
    

      

  • 相关阅读:
    线性表算法设计题2.11
    硬币抛掷模拟(使用数组)
    循环列示例(约瑟夫环问题)
    线性表算法设计题2.15
    ASP.NET2.0中的GRIDVIEW控件在使用TemplateField中的LinkButton时如何在RowCommand事件中找到当前行index的方法
    VS2005发布网站问题及"aspnet_merge.exe”已退出,代码为 1的错误
    弹出对话框的同时保持页面的显示(不变形)
    NET Framework 类库
    一些实用的正则表达式
    CuteEditor6.0使用配置心得体会
  • 原文地址:https://www.cnblogs.com/lautsie/p/3263700.html
Copyright © 2020-2023  润新知