http://community.topcoder.com/stat?c=problem_statement&pm=11225&rd=14427

http://apps.topcoder.com/wiki/display/tc/SRM+498

此题的暴力解法是一个BFS。BFS的话,要有Queue,如果是图的话,还要有Set来记录走过的状态。后面答案中会看到其实可以用贪心,就是只要输入和输出的各种颜色数量一样,就一定能变换过来,这个下回再表。

import java.util.*;
public class NinePuzzle
{
public int getMinimumCost(String init, String goal)
{
int[][] arr = new int[10][];
arr[0] = new int[]{1, 2};
arr[1] = new int[]{0, 2, 3, 4};
arr[2] = new int[]{0, 1, 4, 5};
arr[3] = new int[]{1, 4, 6, 7};
arr[4] = new int[]{1, 2, 3, 5, 7, 8};
arr[5] = new int[]{2, 4, 8, 9};
arr[6] = new int[]{3, 7};
arr[7] = new int[]{3, 4, 6, 8};
arr[8] = new int[]{4, 5, 7, 9};
arr[9] = new int[]{5, 8};
Queue<String> queue = new LinkedList<String>();
HashSet<String> set = new HashSet<String>();
set.add(goal);
queue.offer(goal);
int initStar = -1;
for (int i = 0; i < init.length(); i++)
if (init.charAt(i) == '*')
initStar = i;
int ans = Integer.MAX_VALUE;
while (queue.size() != 0)
{
String s = queue.poll();
char[] ca = s.toCharArray();
int starPos = -1;
for (int i = 0; i < ca.length; i++)
if (ca[i] == '*') starPos = i; if (initStar == starPos)
{
int a = 0;
for (int i = 0; i < s.length(); i++)
{
if (initStar != i && ca[i] != init.charAt(i)) a++;
}
if (ans > a) ans = a;
}
for (int i = 0; i < arr[starPos].length; i++)
{
swap(ca, starPos, arr[starPos][i]);
String tmp = new String(ca);
if (!set.contains(tmp))
{
queue.offer(tmp);
set.add(tmp);
}
swap(ca, starPos, arr[starPos][i]);
}
}
return ans;
} private void swap(char[] ca, int i, int j)
{
char tmp = ca[i];
ca[i] = ca[j];
ca[j] = tmp;
}
}

  

[topcoder]NinePuzzle的更多相关文章

  1. TopCoder kawigiEdit插件配置

    kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...

  2. 记第一次TopCoder, 练习SRM 583 div2 250

    今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...

  3. TopCoder比赛总结表

    TopCoder                        250                              500                                 ...

  4. Topcoder几例C++字符串应用

    本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...

  5. TopCoder

    在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...

  6. TopCoder SRM 596 DIV 1 250

    body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...

  7. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  8. TopCoder SRM 590

     第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement     Fox Ciel is going to play Gomoku with her friend ...

  9. Topcoder Arena插件配置和训练指南

    一. Arena插件配置 1. 下载Arena 指针:http://community.topcoder.com/tc?module=MyHome 左边Competitions->Algorit ...

随机推荐

  1. javascript实现可编辑的下拉框

    曾经遇到过一个需求的情况是这样的,我们提供给用户的输入框的可选择项只能满足用户的大部分情况的选择,但是有时候会遇到一些用户想要输入的数据是下拉项中所没有的,而用户不希望改变下拉项为输入框模式,需要说如 ...

  2. Python解释器运行成功,命令运行显示无此属性解决办法

    情况1: 查看出错的地方的Import包,看本程序是否有名字与import名称相同的py文件或者pyd文件. 有的话删除或者更名即可.

  3. 深入理解C#中this/partial/null的使用

    一.this关键字作用 1.this表示当前运行中的对象 Eg: public class Person { public int age; public string name; public Pe ...

  4. MFC对话框程序EDIT类控件的自动换行,垂直滚动条自动下移

    1.新建一个Edit Control,将其Multiline属性设置为True,Auto HScroll属性设置False,这样就可以实现每一行填满后自动换行了.   2.再将Vetrical Scr ...

  5. android多国语言文件夹

    android多国语言文件夹文件汇总如下:(有些语言的书写顺序可能跟中文是相反的) 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values-zh ...

  6. javascript GB2312转UTF8

    /* * GB2312转UTF8 * 例: * var xx=new GB2312UTF8(); * var Utf8=xx.Gb2312ToUtf8("你aaa好aaaaa"); ...

  7. pop动画大全 只能时代程序员更应该关心效果而不是冷冰冰的代码

    下载地址 https://pan.baidu.com/s/1o8pQWau

  8. IOS_OC_本地推送知识总结

    知识点介绍 一. 推送通知介绍(了解) 二. 本地推送通知 本地通知的基本使用 本地通知的不常用属性 删除重复的通知 通知的处理1-跳转界面 通知的处理2-程序退出 分类的设置/快捷回复 一. 推送通 ...

  9. swift入门-day01

    Swift 简介 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者工 ...

  10. OC加强-day04

    #pragma mark 00知识回顾 //定义一个函数 函数没有返回值函数有一个参数:返回值是double 参数是两个int的block void test(int a); void test(do ...