[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 ...
随机推荐
- bubble_sort
冒泡排序法: #include <iostream> #include <algorithm> using namespace std; int main(){ int n; ...
- 使用ViewState[""]传递Hashtable的值
//首先定义Hashtable myHach = new Hashtable(); //添加键值到Hashtable中myHash.Add("ServiceType1", &quo ...
- ThinkPHP函数详解:cache方法
cache方法是3.0版本开始新增的缓存管理方法.注意:3.1.2版本后因cache方法并入原S方法,所以cache方法不再建议使用,用S方法即可. cache 用于缓存设置.获取.删除操作 用法ca ...
- Asp.Net Core简单整理
1.Asp.NetCore 中文入门文档 http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-index.html
- PhotoView开源项目剖析
http://blog.csdn.net/wu928320442/article/details/43056731 介绍 上一节呢,我们介绍了怎么下载和编译Android源码,这节呢,我们来讨论Pho ...
- 在.Net中进行跨线程的控件操作(下篇:BackgroundWorker)
在.Net中,如果我们在非UI线程上访问窗体上的控件的时候,会产生一个跨线程调用的异常,那么如何处理这种情况呢?在上一章中,我介绍了使用Control.Invoke方法,如果你不习惯使用委托,那么.N ...
- Servlet单实例多线程模式
http://kakajw.iteye.com/blog/920839 前言:Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以 ...
- C#查询当前微信自定义菜单结构
查询 string access_token = "你的token"; string posturl = "https://api.weixin.qq.com/cgi-b ...
- 24种设计模式--责任链模式【Chain ofResponsibility Pattern】
中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父.既嫁从夫.夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的,举个例子来说,一个女 ...
- 实体框架(Entity Framework)简介
实体框架(Entity Framework)简介 简称EF,与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...