日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CSDN论坛上的一道算法题

發(fā)布時(shí)間:2023/12/2 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSDN论坛上的一道算法题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

昨天晚上在CSDN論壇上看到這道題,思索一番后想到一個(gè)解決方案,也簡(jiǎn)單實(shí)現(xiàn)了。今天早上把博客補(bǔ)一補(bǔ)。算是做個(gè)筆記吧。

題目:

有m個(gè)人面向南方站成一排(m?≥1),每喊一次口號(hào)可以有n個(gè)人同時(shí)轉(zhuǎn)身一次(1≤n≤m),問共需喊多少次口號(hào)所有人最終全部面向北方?
請(qǐng)編寫一個(gè)函數(shù),函數(shù)有兩個(gè)參數(shù),分別為m和n,函數(shù)返回值為最終需要的次數(shù),若經(jīng)過無窮大次仍然無法全部轉(zhuǎ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

?

關(guān)注這個(gè)帖子的人還蠻多的,不少人都或完整或不完整的給出了自己的方案。這些方案集中在尋找這個(gè)問題的公式解。

在還沒看下面的回答之前,我思考了一下,與大部分網(wǎng)友不同的是,從一開始我就沒想要找到這個(gè)問題的公式解。我發(fā)現(xiàn)這本質(zhì)上是一個(gè)搜索問題。為什么這么說,且看下面的分析。

1.這m個(gè)數(shù)其實(shí)沒有位置之分,m的數(shù)的狀態(tài)可以用0和1的個(gè)數(shù)來標(biāo)記。

2.一旦指定m,m就不會(huì)再變化了,所以甚至可以只用0的個(gè)數(shù)來標(biāo)記狀態(tài),在這里我用所有m個(gè)數(shù)的和來標(biāo)記狀態(tài)(1的個(gè)數(shù))。

3.每一次變化n個(gè)數(shù),相當(dāng)于向前搜索。用x表示0的個(gè)數(shù),用y表示1的個(gè)數(shù)。變化n個(gè)數(shù)對(duì)m個(gè)數(shù)和的影響就是加上一個(gè)數(shù)。這個(gè)數(shù)可能有多種可能,取值的上限和0的個(gè)數(shù)有關(guān),下限和y的個(gè)數(shù)有關(guān)。用max和min來表示上限和下限,具體來說,當(dāng)x>=n時(shí),max = n;當(dāng)x<n時(shí),max = x - (n - x) = 2x - n;當(dāng)y>=n時(shí),min = -n;當(dāng)y< n 時(shí),min = n - 2y。

4.人工智能課上介紹的搜索算法有很多,BFS,DFS,A-star之類的。BFS能夠得到最優(yōu)解,但是時(shí)間、空間開銷可能比較大,DFS可能在短時(shí)間內(nèi)找到解,但不能保證是最優(yōu)的,A-star有很多優(yōu)點(diǎn),解是最優(yōu)的,速度也快,可是需要啟發(fā)式函數(shù)。這里我采用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);} }

?



?

轉(zhuǎn)載于:https://www.cnblogs.com/moqiguzhu/p/3947984.html

總結(jié)

以上是生活随笔為你收集整理的CSDN论坛上的一道算法题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。