[topcoder]NinePuzzle
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的更多相关文章
- TopCoder kawigiEdit插件配置
kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
- TopCoder比赛总结表
TopCoder 250 500 ...
- Topcoder几例C++字符串应用
本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...
- TopCoder
在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...
- TopCoder SRM 596 DIV 1 250
body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...
- 求拓扑排序的数量,例题 topcoder srm 654 div2 500
周赛时遇到的一道比较有意思的题目: Problem Statement There are N rooms in Maki's new house. The rooms are number ...
- TopCoder SRM 590
第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement Fox Ciel is going to play Gomoku with her friend ...
- Topcoder Arena插件配置和训练指南
一. Arena插件配置 1. 下载Arena 指针:http://community.topcoder.com/tc?module=MyHome 左边Competitions->Algorit ...
随机推荐
- php-fpm 的安装与LNMP测试
1. 下载并安装PHP 1.1 编译安装 1.1.1 安装前的准备 下载并安装libmcrypt 和 libmcrypt-devel[root@test /opt/soft]# wget ftp:// ...
- css定义多重背景动画
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style typ ...
- portal单点登录的原理与实现还有ESB
portal单点登录的原理与实现还有ESB 在毕业论文中有描述到这一点.我给我出的截图
- 万网免费主机wordpress快速建站教程-万网主机申请
很多小伙伴在万网的免费主机申请活动中建立起了自己的个人网站,但还是还有许多小伙伴现在想建站,却发现官网找不到免费主机的申请地址了,以为活动结束了?其实还是可以继续申请免费主机的,接下来小编给大家介绍如 ...
- Android开发之ViewPager
什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果. 如果想向下兼容就必须要android-support-v ...
- 实战突击: Java Web项目整合开发(PDF)
实战突击: Java Web项目整合开发(PDF)
- Jquery基础整理
1.简单的JQuery (1) $(document).ready(function(){ $(document).ready(mydays); alert(“加载完毕,请检查!”); functi ...
- ubuntu网络连接图标不显示
sudo emacs /etc/NetworkManager/nm-system-settings.conf 将managed的值改为true,保存退出. sudo service network-m ...
- 修改sqlplus提示符
如图所示 : 修改 提示符为 username(sid_serial#)@instance_name ,这样其实很方便的 以下是步骤 在11g中glogin.sql 文件是不存在的,取而代之的是 lo ...
- fastjson的坑 com.alibaba.fastjson.JSONObject cannot be cast to xxx
解析json对象时,使用了new TypeReference()对象 fastjson会对解析的对象类型进行缓存 new TypeReference<ResultData>(){} ...