【穷举】用c#实现一个数组(1,1,2,2,3,3,4,4)排列,每两个相同数字中间都间隔了这个数字个数

从题目上看,这个感觉好绕口。其实嘛应该是我表述有问题。

举例吧:

1,[],1

2,[],[]2

这样子,两个相同数字之间要有几个坑。

其实这个数组计算量不算太大。推理能力好的话,分分钟解决了。

在这里我想通过程序去实现的目的:

1、为了空想这个实现过程,思想斗争了一晚上没睡觉,那种穷举方法比较好。其实我都没写过穷举。(--真是想太多)

2、了解下穷举算法。(我也不知道我下面写的方法算不算穷举。哈哈)

首先我们得有一个思路。【穷举出所有可能出现的排列方式=>规则匹配符合要求的数组 =>输出】

第一步:穷举

我的第一个错误的实现方法,我也写出来不怕丢人(嘿嘿)。那是这样的:

既然有八个位置。那么不考虑重复的情况下。(即默认它都是不相同的)

我们先定义八个字符串。

 1 string[] strs = new string[8] { "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8" };
 2            string[] temp = new string[8];
 3            int x=0;
 4            for (int i = 0; i < strs.Length; i++)
 5            {
 6                temp[0] = strs[i];
 7                for (int i1 = 0; i1 < strs.Length; i1++)
 8                {
 9                    if (temp[0]!=strs[i1])
10                    {
11                        temp[1] = strs[i1];
12                        for (int i2 = 0; i2 < strs.Length; i2++)
13                        {
14                            if (temp[0] != strs[i2]&&temp[1]!=strs[i2])
15                            {
16                                temp[2] = strs[i2];
17                                for (int i3 = 0; i3 < strs.Length; i3++)
18                                {
19                                    if (temp[0] != strs[i3] && temp[1] != strs[i3]&&temp[2]!=strs[i3])
20                                    {
21                                        temp[3] = strs[i3];
22                                        for (int i4 = 0; i4 < strs.Length; i4++)
23                                        {
24                                            if (temp[0] != strs[i4] && temp[1] != strs[i4] && temp[2] != strs[i4]&&temp[3]!=strs[i4])
25                                            {
26                                                temp[4] = strs[i4];
27                                                for (int i5 = 0; i5 < strs.Length; i5++)
28                                                {
29                                                    if (temp[0] != strs[i5] && temp[1] != strs[i5] && temp[2] != strs[i5] && temp[3] != strs[i5]&&temp[4]!=strs[i5])
30                                                    {
31                                                        temp[5] = strs[i5];
32                                                        for (int i6 = 0; i6 < strs.Length; i6++)
33                                                        {
34                                                            if (temp[0] != strs[i6] && temp[1] != strs[i6] && temp[2] != strs[i6] && temp[3] != strs[i6] && temp[4] != strs[i6]&&temp[5]!=strs[i6])
35                                                            {
36                                                                temp[6] = strs[i6];
37                                                                for (int i7 = 0; i7 < strs.Length; i7++)
38                                                                {
39                                                                    if (temp[0] != strs[i7] && temp[1] != strs[i7] && temp[2] != strs[i7] && temp[3] != strs[i7] && temp[4] != strs[i7] && temp[5] != strs[i7]&&temp[6]!=strs[i7])
40                                                                    {
41                                                                          temp[7] = strs[i7];
42                                                                          x++;//作为统计穷举次数
43
44                                                                    }
45
46                                                                }
47                                                            }
48
49                                                        }
50                                                    }
51
52                                                }
53                                            }
54
55                                        }
56                                    }
57
58                                }
59                            }
60
61                        }
62                    }
63
64                }
65            }
66            Console.WriteLine(x);
67            Console.ReadLine();
68         }

血的教训告诉我们8*7*6*5*4*3*2=40320
我尝试过,如果每个字符串数组如果要输出的话,大概需要10分钟左右。更不要说,遍历每个字符串数组然后匹配规则,输出了。这才4个数字的,此方法直接扑街(pu  gai)!

第二种方法。直接利用相同的数字去排除。然后穷举:

方法举例:假设第一种方法中的“x1”,“x2”是1那么在第二种方法中 x1,x3,x2 只算一个,在第一种方法中算至少两个。

这种方法直接将数组减少到

不多说直接上代码

穷举方法二

整整减少为原来的1/16.

第二步:规则匹配。在所有可能的数组中找出符合要求的数组

穷举完了,接下来就是规则匹配。

遍历数组。然后根据两个相同数在数组中的索引位置差的绝对值为该数值加1;

注意:要考虑到索引超出界限的问题!

 1  public static bool IsYes(string[] str)
 2        {
 3            bool isYON = false;
 4             List<string> intList =new List<string>();
 5            for (int i = 0; i < str.Length; i++)
 6            {
 7                try
 8                {
 9
10                    if (str[i] == str[i + Convert.ToInt32(str[i]) + 1] || str[i] == str[i - Convert.ToInt32(str[i]) - 1])
11                    {
12                        intList.Add(str[i]);
13                        isYON = true;
14                    }
15                    else
16                    {
17                        return false;
18                    }
19                }
20                catch (Exception)
21                {
22
23                    if (str[i] == str[Math.Abs(i - Convert.ToInt32(str[i]) - 1)]&&intList.Contains(str[i]))
24                    {
25                        isYON = true;
26                    }
27                    else
28                    {
29                        return false;
30                    }
31                }
32            }
33            return isYON;
34        }

规则匹配

这样。

这篇文章并没有什么很高的技术含量。反而还比较考验思路的连贯性。

文笔不好,表述有不到位的地方,还请各位多多见谅。

本人对算法基本上是一无所知。如果有好的对算法的学习方法还请不啬赐教。将不胜感激!

如果有更好的实现的方法,或者改进的方法可以在下面评论指出或者发送到我的邮箱 paul_0715 at sina dot com

时间: 2024-10-08 10:16:51

【穷举】用c#实现一个数组(1,1,2,2,3,3,4,4)排列,每两个相同数字中间都间隔了这个数字个数的相关文章

Java杂谈三之判断素数以及穷举素数

首先确认下什么是素数,又称质数 百度的定义解答: 质数(prime number)又称素数,有无限个.一个大于1的自然数,如果除了1和它本身 外,不能被其他自然数整除(除0以外)的数称之为素数(质数) 明确了素数的定义后,下面用java来判断素数以及穷举2-999以内的素数,还是一样,主 要看的是对一个数进行判断或者对一组数进行判断的思想,至于怎样判断的,百度的定义已经给了很好的解答思路. JavaPrimeNubmer:类名 enumPrimeNumber():穷举2-999以内的所有素数 m

js 求一个数组元素的最小公倍数

今天我在网上查 "js 求一个数组元素的最小公倍数",不管是Google还是百度,查出来的答案竟然都是一样的,最关键的是这是错误的. 错误在哪那!刚一看感觉是正确的,而且你输入几个不同的数组,输出的是正确的,but,当我输入[2,3,4]的时候竟然是24,这就很明显不对了,还有输入[0,1]的时候输出的是1, 我发现了这两点不对.好了贴一下我自己的代码. var lcm = function () { // TODO: Program me var m=0; for(var i=0;i

JAVA数硬币之穷举法以及在循环前可以放一个标号来标志循环

注:continue 和break 只对当前循环起作用 但是带标号的continue 和break 对标号的循环起作用 public class 凑硬币_穷举法 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int amount = in.nextInt(); FLAG: for(int one = 0;one<=

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

迷宫问题求解之“穷举+回溯”(一)(转载)

求迷宫从入口到出口的所有路径是一个经典的程序设计问题,求解迷宫,通常采用的是“穷举+回溯”的思想,即从入口开始,顺着某一个方向出发,若能够走通,就继续往前走:若不能走通,则退回原路,换一个方向继续向前探索,直到所有的通路都探寻为止.因此本文依据这种“穷举+回溯”的思想,设计一个求解迷宫的程序. 1 问题分析 为了保证在任何位置上都能够退回原路,显然需要使用一个先进后出的数据结构来保存已经探寻过的位置,因此在程序求解迷宫路径的过程中采用栈这种数据结构. 迷宫是一个二维地图,其中含有出口和入口,障碍

基于NVIDIA GPU的MD5加速穷举(CUDA)

声明:本文仅限于技术分享,请勿将代码用于非法用途,利用本文代码所产生的各种法律问题,与本文作者无关. 1. 摘要: MD5为非常普遍使用的消息摘要算法,很多应用系统采用该算法加密密码,在计算文件摘要值以验证文件是否被篡改方面也普遍使用, MD5服务安全方面很多年,随着计算机技术的发展,该算法已经很不安全,穷举遍历的代价也变得没那么高,笔者建议至少采用(SHA1+盐值) 方法加密新建设的应用系统,由于目前很多网站大量的用户名密码泄露,个人的信息安全也越来越重要,目前很多系统采用的加密算法有: 1>

迭代法,穷举法及其练习题

总结:1.基本语法:数据类型,类型转换,输入输出,运算符(条件运算符) ? : 2.分支语句:有选择性的执行某行或某段代码if ... else if ... else... --最主要,必须要记住并且灵活运用switch ... case ... default... --看到要明白什么意思 分支嵌套:在符合一定条件的基础上继续判断其它条件 3.循环语句:循环四要素:初始条件,循环条件,循环体,状态改变for() //最常用,最好用,最清晰,最灵活{ }必须记住,掌握,灵活运用 while()

穷举(三):建模分析后穷举

有些问题没有明确的区间限制,可根据问题的具体实际进行建模分析,再确定穷举对象及范围进行穷举. [例7]质数幻方 通常的n阶幻方是由1,2,…,n2构成的各行.各列与两对角线之和均相等n行n列方阵.质数幻方则全是由质数构成的各行.各列与两对角线之和均相等的方阵. 例如: 17  113   47 89   59   29 71    5  101 就是一个3阶质数幻方.方阵中9个质数的总和为531. 试寻求9个质数,构造一个3阶质数幻方,使得该质数方阵中3行.3列与两对角线上的3个质数之和均不超过

穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753

下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A message from humans to extraterrestrial intelligence was sent through the Arecibo radio telescope in Puerto Rico on the afternoon of Saturday November 16