CSDN论坛上的一道算法题

源地址为:http://bbs.csdn.net/topics/390854089

昨天晚上在CSDN论坛上看到这道题,思索一番后想到一个解决方案,也简单实现了。今天早上把博客补一补。算是做个笔记吧。

题目:

有m个人面向南方站成一排(m ≥1),每喊一次口号可以有n个人同时转身一次(1≤n≤m),问共需喊多少次口号所有人最终全部面向北方?
请编写一个函数,函数有两个参数,分别为m和n,函数返回值为最终需要的次数,若经过无穷大次仍然无法全部转向北方,则输出-1.
例1:
m = 6,n =5:
用0表示面向南方,1表示面向北方,过程如下:

0 0 0 0 0 0
0 1 1 1 1 1
1 1 0 0 0 0
0 0 0 1 1 1
1 1 1 1 0 0
0 0 0 0 0 1
1 1 1 1 1 1

返回6
例2:
m = 3,n = 2:
返回-1

 

关注这个帖子的人还蛮多的,不少人都或完整或不完整的给出了自己的方案。这些方案集中在寻找这个问题的公式解。

在还没看下面的回答之前,我思考了一下,与大部分网友不同的是,从一开始我就没想要找到这个问题的公式解。我发现这本质上是一个搜索问题。为什么这么说,且看下面的分析。

1.这m个数其实没有位置之分,m的数的状态可以用0和1的个数来标记。

2.一旦指定m,m就不会再变化了,所以甚至可以只用0的个数来标记状态,在这里我用所有m个数的和来标记状态(1的个数)。

3.每一次变化n个数,相当于向前搜索。用x表示0的个数,用y表示1的个数。变化n个数对m个数和的影响就是加上一个数。这个数可能有多种可能,取值的上限和0的个数有关,下限和y的个数有关。用max和min来表示上限和下限,具体来说,当x>=n时,max = n;当x<n时,max = x - (n - x) = 2x - n;当y>=n时,min = -n;当y< n 时,min = n - 2y。

4.人工智能课上介绍的搜索算法有很多,BFS,DFS,A-star之类的。BFS能够得到最优解,但是时间、空间开销可能比较大,DFS可能在短时间内找到解,但不能保证是最优的,A-star有很多优点,解是最优的,速度也快,可是需要启发式函数。这里我采用BFS。

下面是我的代码:

import java.util.ArrayList;
import java.util.Iterator;import javax.management.openmbean.ArrayType;
import javax.management.openmbean.SimpleType;public class OneAlgorithm {/*** * @param x: x is number of zeros* @param y: y is number of ones * @return*/public static int max(int x, int y, int n){int max = 0;if(x >= n)max = n;elsemax = 2 *x - n;return max;}public static int min(int x, int y, int n){int min = 0;if(y >= n)min = -n;elsemin = n - 2*y;return min;}/*** * @param m* @param n* @return*/public static int BFS(int m, int n){if(m % n == 0)return n;ArrayList<Integer> states = new ArrayList<Integer>();ArrayList<Integer> floors = new ArrayList<Integer>();int floor = 0;int zeros = m;floors.add(floor);states.add(zeros);int index = 0;int max, min;int x = m;int y = 0;max = max(x,y,n);min = min(x,y,n);while(true){while(max >= min){zeros = x - min;if(zeros == 0)return floors.get(index)+1;if(floors.indexOf(index) == floor)floor++;if(!states.contains(x-min)){states.add(x-min);floors.add(floor);    }min = min + 2;}    index = index + 1;if(index+1 > states.size())return -1;x = states.get(index);y = m - x;max = max(x,y,n);min = min(x,y,n);}}public static void main(String[] args){int temp = BFS(13,7);System.out.println(temp);}
}

 



 

转载于:https://www.cnblogs.com/moqiguzhu/p/3947984.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eclipse程序员要掌握的常用快捷键

判断一个人的编程水平&#xff0c;就看他用键盘多&#xff0c;还是鼠标多。用键盘一是为了输入代码&#xff08;当然了&#xff0c;也包括注释&#xff09;&#xff0c;再有就是熟练使用快捷键。曾有人在豆瓣评《卓有成效的程序员》&#xff1a;“人有多大懒&#xff0c;才有多…

spring依赖注入_Spring依赖注入技术的发展

spring依赖注入回顾Spring框架的历史&#xff0c;您会发现在每个发行版中实现依赖注入的方法越来越多。 如果您使用该框架已经超过一个月&#xff0c;那么在这篇回顾性文章中可能不会发现任何有趣的东西。 除了Scala中的最后一个示例&#xff0c;没有其他东西希望如此。 首先是…

java 获取oracle mysql sqlserver 链接 connection

import java.sql.Connection; import java.sql.DriverManager; //获取sqlserver connection public static Connection getSQLServerConn(){ Connection dbConn null; String driverName "com.microsoft.sqlserver.jdbc.SQLServerDriver"; …

TortoiseSVN菜单项功能说明

原帖地址&#xff1a;http://blog.csdn.net/windone0109/article/details/4030274 TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具。通过使用它&#xff0c;我们可以可视化的管理我们的版本库。不过由于它只是一个客户端&#xff0c;所以它不能对版本库进行权限管理。…

hornetq_Spring 3 HornetQ 2.1集成教程

hornetq通过Spring框架使用JBoss的新超高性能消息传递系统。 HornetQ是一个开放源代码项目&#xff0c;用于构建多协议&#xff0c;可嵌入&#xff0c;非常高性能的集群异步消息传递系统。 它是用Java编写的&#xff0c;并且可以在具有Java 5或更高版本运行时的任何平台上运行…

zoj 3811 untrusted patrol

昨天网赛的C题&#xff0c;我负责的&#xff0c;题意有些模模糊糊的 我首先弄清楚了题意&#xff0c;即要求一个patrol是否可能巡视过所有的点&#xff0c;首先整个图要是连通的&#xff0c;这个在建图的时候边用下并查集即可&#xff0c;然后某些点装了传感器&#xff0c;传感…

上周热点回顾(9.1-9.7)

热点随笔&#xff1a; 魅族的“火爆”预定表示“呵呵呵”-不要怪我拆穿&#xff08;tankaixiong&#xff09; 【调侃】IOC前世今生&#xff08;家住腊树下&#xff09; 跟着8张思维导图学习javascript&#xff08;Ico_Coco&#xff09; 下一代Asp.net开发规范OWIN&#xff08;…

mockito手动注入依赖_依赖注入–手动方式

mockito手动注入依赖依赖注入是一种将行为与依赖解决方案分开的技术。 用简单的话来说&#xff0c;它使开发人员可以定义具有特定功能的类&#xff0c;这些功能取决于各种协作者&#xff0c;而不必定义如何获取对这些协作者的引用。 以此方式&#xff0c;实现了各个组件之间的解…

ubuntu使用root权限登录的设置方法

Ubuntu系统默认是不允许用户以root身份登录的&#xff0c;在网上找到的方法如下&#xff1a; 1、首先设置root密码&#xff0c;利用现有管理员帐户登陆Ubuntu&#xff0c;在终端执行命令&#xff1a;sudo passwd root&#xff0c;接着输入密码和root密码&#xff0c;重复密码。…

visio 小技巧

Visio作图非常的方便 目前我还是用Visio2003&#xff0c;有一些小技巧&#xff0c;记录一下。 1、visio修改文本框文字对齐方式。默认的对齐方式是上下、左右居中。修改的位置: 在一个文档中可以插入多个标签页&#xff0c;当需要分页&#xff0c;用不同页归类不同信息的时候使…

java实现bean实体与map集合相互转换

方法一 //bean装换成map public static Map<?, ?> objectToMap2(Object obj) { if(obj null) return null; return new org.apache.commons.beanutils.BeanMap(obj); } 方法二 //bean装换成map public static Map&l…

java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配

java中字符串的精确匹配在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将讨论String性能调优。 我们将专注于如何有效地处理字符串创建&#xff0c; 字符串更改和字符串匹配操作。 此外&#xff0c;我们将提供我们自己的用于精确字…

My.Ioc 代码示例——避免循环依赖

本文的目的在于通过一些示例&#xff0c;向大家说明 My.Ioc 支持哪些类型的依赖关系。也就是说&#xff0c;如何设计对象不会导致循环依赖。 在 Ioc 世界中&#xff0c;循环依赖是一个顽敌。这不仅因为它会导致 Ioc 容器抛出异常&#xff0c;而且还因为它是不可预知的&#xff…

java实现base64加密解密

/** * 加密 * param str * return */ public static String getStr(String str){ BASE64Encoder base64 new BASE64Encoder(); return base64.encode(str.getBytes()); } /** * 解密 * param str * return * t…

设计模式之单件模式(Singleton Pattern)

一.单件模式是什么&#xff1f; 单件模式也被称为单例模式&#xff0c;它的作用说白了就是为了确保“该类的实例只有一个” 单件模式经常被用来管理资源敏感的对象&#xff0c;比如&#xff1a;数据库连接对象、注册表对象、线程池对象等等&#xff0c;这种对象如果同时存在多个…

asp.net中两款文本编辑器NicEdit和Kindeditor

分类&#xff1a; C#/ASP.Net 2012-10-09 22:35 665人阅读 评论(0) 收藏 举报 文本编辑asp.nettextboxserveraspsafari目录(?)[] 做过Web开发的朋友相信都使用过富文本编辑器&#xff0c;比较出名的CuteEditor和CKEditor很多人应该已经使用过&#xff0c;在功能强大的同时需要…

导出oracle awr分析报告,配置oracle内存参数,察看表空间使用率

cmd 命令生成awr报告: cmd 窗口 输入 -> Sqlplus sys/orclorcl as sysdba (sys登陆oracle).导出awr命令 ?/rdbms/admin/awrrpt.sql 3..输入导出的文件格式 为 html 回车 4输入数字1 为导出今天的分析报告 &#xff0c;2 3 。。。&#xff0c;回车 5.输入开始 snap id…

android多点触控自由对图片缩放

在系统的相册中,观看相片就可以用多个手指进行缩放.要实现这个功能,只需要这几步:1.新建项目,在项目中新建一个ZoomImage.javapublic class ZoomImageView extends View {//初始化状态常量public static final int STATUS_INIT1;//图片放大状态常量public static final int STA…

台阶问题额

题目名字 台阶问题 题意 初始化数组f的第一个元素为1。这表示到达第0级台阶的方式数为1&#xff0c;即不需要迈任何台阶。从第1级台阶开始&#xff0c;迭代计算每一级台阶的不同方式数。对于当前台阶i&#xff0c;内部循环从1到i和k中的较小值开始迭代。这是因为每次只能向上…

jboss eclipse_调试生产服务器– Eclipse和JBoss展示

jboss eclipse您是否编写有错误的代码&#xff1f; 不&#xff0c;当然不是。 对于我们其余的人&#xff0c;他们确实会编写带有bug的代码&#xff0c;我想解决一个非常敏感的问题&#xff1a;调试在生产服务器上运行的应用程序。 因此&#xff0c;您的应用程序已准备好进行部…