算法高手请进

问题描述

这里有若干个字母组成的列。从最顶层开始,取走相同的字母,之后下一行的字母顶上,比如两个I(在B和C列),之后下面的两个P顶上,在之后可以取走四个P,以此类推。取字母只能取顶层连续向下。问:如何得到最少的步骤把字母全部取光?

解决方案

解决方案二:
这个,好像只能回溯吧?分少没动力。找现成的代码吧。
解决方案三:
我在VBGood论坛得到了beyondyf的解答。我用了一下的类来解决上面的问题,但算5X8的矩阵要好一个小时以上。高人们我如何设置搜索的深度来缩短计算时间。原贴地址是http://www.vbgood.com/viewthread.php?tid=66872&extra=page%3D1&page=5

classRubbish{publicRubbish(int[,]map){this.map=map;//map是从字符数组见上图,转到int的数组row=map.GetLength(0);col=map.GetLength(1);point=newint[col];remove_step=newint[map.Length];remove_step_count=0;remove_step_save=newint[map.Length];remove_step_save_count=0;Done();}publicint[]Result(){int[]ret;ret=newint[remove_step_save_count];for(inti=0;i<remove_step_save_count;i++)ret[i]=remove_step_save[i];returnret;}privatevoidDone(){int[]a;a=GetCanBeRemovedElement();int[]p;p=newint[point.Length];for(inti=0;i<p.Length;i++)p[i]=point[i];if(a.Length==0){if(remove_step_save_count==0||remove_step_save_count>remove_step_count){for(inti=0;i<remove_step_count;i++)remove_step_save[i]=remove_step[i];remove_step_save_count=remove_step_count;}return;}for(inti=0;i<a.Length;i++){remove_step[remove_step_count]=a[i];remove_step_count++;Remove(a[i]);Done();for(intj=0;j<point.Length;j++)point[j]=p[j];remove_step_count--;}}privatevoidRemove(inte){for(inti=0;i<col;i++)if(point[i]<row)if(map[point[i],i]==e)point[i]++;}privateint[]GetCanBeRemovedElement(){System.Collections.ArrayLista=newSystem.Collections.ArrayList();for(inti=0;i<col;i++){if(point[i]<row&&a.IndexOf(map[point[i],i])<0)a.Add(map[point[i],i]);}int[]ret;ret=newint[a.Count];for(inti=0;i<a.Count;i++)ret[i]=(int)a[i];returnret;}privateint[,]map;privateint[]point;privateint[]remove_step;privateint[]remove_step_save;privateintremove_step_count;privateintremove_step_save_count;privateintrow;privateintcol;}
解决方案四:
这里是另一高人的程序没代码。但他就是利用递归的深度优先搜索遍历解空间。我如何改上面的代码来减少计算时间。
解决方案五:
感觉很像某个游戏啊,mark,待会有空试试
解决方案六:
第一次取完两个I之后两个P顶上,那最后一行的BC列会变成什么?
解决方案七:
privateList<string>listCol=newList<string>();privateList<List<string>>listMatrix=newList<List<string>>();privatestaticList<int>sol;privateList<int>temp;privateintiColCount;privatevoidForm1_Load(objectsender,EventArgse){string[][]strAy={newstring[]{"A","C","S","Q","T","I","P","R"},newstring[]{"I","P","A","S","D","W","W","R"},newstring[]{"I","P","A","S","S","E","W","E"},newstring[]{"P","S","A","H","J","K","H","G"},newstring[]{"P","G","R","E","W","D","F","G"},newstring[]{"L","K","H","G","T","Y","R","D"},newstring[]{"S","D","F","G","H","J","Y","G"},newstring[]{"A","D","F","F","D","G","H","A"}};iColCount=strAy.Length;for(inti=0;i<strAy.Length;i++){listMatrix.Add(newList<string>());for(intj=0;j<strAy[i].Length;j++)listMatrix[i].Add(strAy[i][j]);}}privatevoidbutton1_Click(objectsender,EventArgse){temp=newList<int>();sol=newList<int>();getSol(listMatrix);Console.WriteLine("BestSol:");for(inti=0;i<temp.Count;i++)Console.Write(sol[i].ToString());Console.WriteLine();}privatevoidgetSol(List<List<string>>listMatrix){inti;for(i=0;i<listMatrix.Count;i++){if(listMatrix[i].Count>0)break;}if(i==listMatrix.Count){for(intj=0;j<sol.Count;j++)Console.Write(sol[j].ToString());Console.WriteLine();if(sol.Count<temp.Count||temp.Count==0)temp=sol;return;}List<string>listHave=newList<string>();for(i=0;i<iColCount;i++){while(listMatrix[i].Count==0&&i<iColCount-1)i++;if(listMatrix[i].Count>0&&!listHave.Contains(listMatrix[i][0])){stringstrNow=listMatrix[i][0];listHave.Add(strNow);sol.Add(i);List<int>tempremove=newList<int>();for(intj=i;j<iColCount;j++){while(listMatrix[j].Count==0&&j<iColCount-1)j++;if(listMatrix[j].Count>0&&listMatrix[j][0]==strNow){listMatrix[j].RemoveAt(0);tempremove.Add(j);}}getSol(listMatrix);for(intj=0;j<tempremove.Count;j++){listMatrix[tempremove[j]].Insert(0,strNow);}sol.RemoveAt(sol.Count-1);}}}

试着写的,发现代码跟2楼很相似。看来想到的都是回溯。执行起来估计一年不够吧。如果优化的话,最多也就是把2楼代码的for(inti=0;i<p.Length;i++)[我的for(i=0;i<iColCount;i++)]这句改一下,改成优先循环能去掉较多的字母的方案。好处是可以尽快得到比较优秀的解,想得到最优还是要完全遍历才可以。
解决方案八:
是不是该某列为空删除或两侧列相邻的规则啊不然如何取光
解决方案九:
简化问题就是:某字符矩阵,从上往下取走字母(不能取中间层),一次只能取走的列最顶端相同字母。依次取走,并把取走的字母按循序组成一个字符串返回输出。
解决方案十:
引用6楼HimeTale的回复:

如果优化的话,最多也就是把2楼代码的for(inti=0;i<p.Length;i++)[我的for(i=0;i<iColCount;i++)]这句改一下,改成优先循环能去掉较多的字母的方案。

请赐教,如何优化这段代码。不然实在是太慢了。8X4000的矩阵估计到人类灭绝也得不到结果。
解决方案十一:
下沉太快了

时间: 2024-07-29 19:47:40

算法高手请进的相关文章

微积分-vc 数字图像处理高手请进!

问题描述 vc 数字图像处理高手请进! 图像的梯度锐化 看到上面的公式,我叫一个晕,请问这是哪里才能学到呀?什么意思呀?还需要学习微积分吗? 解决方案 这个公式你仔细琢磨就懂了,第一个实际上是数字的差分,求得是点(i,j)的x和y方向的微分值的和,这里理解为这个像素点的梯度值.第二个就是锐化的过程,当梯度值大于某个阈值时,锐化的结果即此点的梯度值,若梯度小于那个阈值,则锐化的结果是原像素的值. 像这类比较基础的图像处理方法,建议你看一下清华大学章毓名教授写的<图像工程>. 解决方案二: 数字图

c语言-C语言高手请进:这个分块求和C语言程序问题出在哪里??对一组无规律数据按正数、负数和零分块求和,

问题描述 C语言高手请进:这个分块求和C语言程序问题出在哪里??对一组无规律数据按正数.负数和零分块求和, 对一组无规律数据按正数.负数和零分块求和,即要求将序列中相邻的正数.零及负数分块累加输出,格式要求: 源数据: 2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2,...(共100个) 整理输出为: 2,5,13,19,0,0,-2,-3,-7,0,5,11,18,-5,-7...(共100个) 以下程序哪里出了问题?我搞了2星期,总是得不到完整输出: int main(

php curl采集高手请进

问题描述 php curl采集高手请进 http://www.lecai.com/ 这个网站怎么用php/url技术进行模拟登录?求参考程序..... 解决方案 我大致看了一下,个人习惯使用Snoopy.class.php模拟登陆,觉得不好可以忽略 POST http://www.lecai.com/user/ajax_login.php HTTP/1.1Host: www.lecai.comUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:3

apt-ubuntu 高手请进,yara not found

问题描述 ubuntu 高手请进,yara not found 用apt-get intstall yara后,还是出现了configure: error: yara not found 请问为什么会这样,好烦啊,在线求高手解答 解决方案 spt-get install 是安装命令, 如果系统没有找到 yara 的安装包,就会这样. 查查 ubuntu 的在线安装配置. 解决方案二: 一个是看是否安装成功,其次看安装的yara能否执行,有没有错误.

高分悬赏 请大神指导-VBA高手请进 懂得webbrowser

问题描述 VBA高手请进 懂得webbrowser 请问如何通过VBA能够获取网页弹出窗体的Docuement对象,我是要操作弹出窗体里面的一线控件完成自动复制! 我现在可以获取到主页面的Document对象.

hbm-Hibernate 帅哥高手请进...关于Hibernate的三表关联,在线等...

问题描述 Hibernate 帅哥高手请进...关于Hibernate的三表关联,在线等... 表1: File (FID,Fname) 表2: UserGroup(GID,Gname) 表3: ActionPermissions(PID,Pname) 表4: File_Group_Permissions(ID,FID,GID,PID) 用四个表完成给某个文件指定用户组每个用户组指定权限,一文件对应多个用户组 每个用户组针对这个文件有不同的操作权限.Hibernate应该如何配置,表结构是否合理

vb参数传递-VB高手请进!在线等。。——shell使用dos命令时参数的传递

问题描述 VB高手请进!在线等..--shell使用dos命令时参数的传递 怎样才能将%LOGPATH%所替代的内容传递到其中? (不要写成调用bat的形式) 解决方案 不行的,%logpath%不能包在括号里,应该这样 Shell "cmd /k mkdir "+LOGPATH+" > nul 2>&1", vbNormalNoFocus vb调用dos是直接运行引号内的,而不给某一变量赋值.另外包在百分号内的是bat变量而不是vb的变量 解决

多线程-高手请进!!!---线程安全问题,怎么解决new String 问题

问题描述 高手请进!!!---线程安全问题,怎么解决new String 问题 场景是:一个订单号只能一个在付款,只能一个线程处理,不同的订单号支持并发处理 现在如果是new String("20140719140818");就有问题怎么解决 如果不是new出来的,什么情况会出现问题 public class Test { public static void main(String[] args) { new Thread(){ public void run(){ pay(&quo

贝叶斯+mahout-朴素贝叶斯分类问题 高手请进

问题描述 朴素贝叶斯分类问题 高手请进 网上资料讲mahout 贝叶斯的很多,都是讲准备数据,划分测试集训练集,测试训练样本...但是,之后呢?有了这个测试很好的模型,怎么对其他的数据分类啊?比如我通过mahout进行朴素贝叶斯分类,得到训练集,测试也很好,那么有了这个训练集之后怎么对其他数据进行分类呢.说的越详细越好. 解决方案 运行mahout的朴素贝叶斯分类器 1.准备数据1.1 下载数据集,并解压 wget http://people.csail.mit.edu/jrennie/20Ne