C# 算法

yinxubest87 2008-01-15 10:26:14
1、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

2、用1、2、2、3、4、5这六个数字,写程序打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"的右边不能是"5"。
...全文
1011 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
wlily0604 2011-08-23
  • 打赏
  • 举报
回复
初来的新手。 按我自己的想法写了一个, 有点复杂。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//------------------------------------------My Method------------------------------------------------------
List<ListQueue> list1= new List<ListQueue> (n);
for (int i = 0; i < n; i++)
{
list1.Add(new ListQueue(i+1, true));
}
int temp = n;
int j = 0;
int start = 1;
while (temp >=2)
{
for (j = 0; j < n; j++)
{
//Console.WriteLine(list1[j].Number);
if (start % 3 == 0 && list1[j].IsInList == true)
{
Console.WriteLine("{0} prompted.", list1[j].Number);
list1[j].IsInList = false;
temp = temp - 1;
start = 1;
}
else if (list1[j].IsInList == true) //if (j < n-1) // if it is the last item, don't need to plus
{
start++;
}
}
}
j = 0;
while(j<n)
{
if (list1[j].IsInList != true)
j++;
else
break;
}
Console.WriteLine("The last one in original List is in {0}th number, value is {1}", j, list1[j].Number);

Console.ReadLine();
}

public class ListQueue
{
int _number ;
Boolean _isInList;
public int Number
{
get
{
return _number;
}
set
{
_number = value ;
}
}

public Boolean IsInList
{
get
{
return _isInList;
}
set
{
_isInList = value ;
}
}

public ListQueue(int number, Boolean isInList)
{
_number = number;
_isInList = isInList;
}
}
}
}

yinxubest87 2008-01-17
  • 打赏
  • 举报
回复
谢谢各位朋友的支持```呵
yinxubest87 2008-01-17
  • 打赏
  • 举报
回复
大家好,我是LZ 由于分数不多,所以只给有答案的朋友了。呵```
莫见怪```
yinxubest87 2008-01-17
  • 打赏
  • 举报
回复
yuwenge 活得痛快 28楼你说话太绝对啦!不对的,呵```
这个不是我的作业,况且就算这样 的话,大家一起讨论不是可以接受到更多的思想吗?对吧```

烦恼 我确实毕业了也找不到工作,呵 55
vwxyzh 2008-01-17
  • 打赏
  • 举报
回复
改版成Long型,计算超多人的大圈:)
        static void Main(string[] args)
{
long n = 5000000000000000000L;//18个0,呵呵
long m = 3L;
Console.WriteLine(Test(n, m));
Console.ReadLine();
}

static long Test(long n, long m)
{
return GetZeroBasedIndex(n, m, 0) + 1;
}

static long GetZeroBasedIndex(long n, long m, long offset)
{
if (n == 1L)
return 0L;
long index = GetZeroBasedIndex(n - (n + offset) / m, m, (n + offset) % m);
return index + (index + offset) / (m - 1);
}
yaoleshi 2008-01-17
  • 打赏
  • 举报
回复
标记
he_8134 2008-01-17
  • 打赏
  • 举报
回复
=.=不同的代码 同样的算法。。。
shizhu820228 2008-01-17
  • 打赏
  • 举报
回复
标记
Hesperus 2008-01-17
  • 打赏
  • 举报
回复
是有点意思,不过闲人真是不少啊
vwxyzh 2008-01-17
  • 打赏
  • 举报
回复
围成一圈那个把我在19楼的算法递归化后得到的结果:
        static void Main(string[] args)
{
int n = 50;
int m = 3;
Console.WriteLine(GetOneBasedIndex(n, m));
Console.ReadLine();
}

static int GetOneBasedIndex(int n, int m)
{
return GetZeroBasedIndex(n, m, 0) + 1;
}

//核心代码就这个方法
static int GetZeroBasedIndex(int n, int m, int offset)
{
if (n == 1)
return 0;
int index = GetZeroBasedIndex(n - (n + offset) / m, m, (n + offset) % m);
return index + (index + offset) / (m - 1);
}
airwaterland 2008-01-17
  • 打赏
  • 举报
回复
第一个题目用队列,谢谢,很简单.
stning 2008-01-17
  • 打赏
  • 举报
回复
ding
Q_282898034 2008-01-17
  • 打赏
  • 举报
回复
=.=不同的代码 同样的算法。。。
=============================

不要把我 7 楼倒推和他们的算法混为一谈.
zrf2006 2008-01-17
  • 打赏
  • 举报
回复
记的好象是算法的例子
psychese 2008-01-17
  • 打赏
  • 举报
回复
第一题

class main
{
static void Main()
{
StringBuilder sb = new StringBuilder();
for (int i = 'a'; i <= 'z'; i++)
sb.Append((char)i);
int temp = 1;
int index = 0;
while (sb.Length > 2)
{
if (temp++ < 3)
{
Console.Write(sb[index++] + " ");
}
else
{
Console.Write("(" + sb[index] + " out) ");
sb.Remove(index, 1);
temp = 1;
}
if (index == sb.Length)
index = 0;
}
}
}

输出:
a b (c out) d e (f out) g h (i out) j k (l out) m n (o out) p q (r out) s t (u out) v w (x out) y z (a out) b d (e out) g h (j out) k m (n out) p q (s out) t v (w out) y z (b out) d g (h out) k m (p out) q t (v out) y z (d out) g k (m out) q t (y out) z g (k out) q t (z out) g q (t out)
xiaoku 2008-01-17
  • 打赏
  • 举报
回复
轻轻的飘过...
Efcndi 2008-01-17
  • 打赏
  • 举报
回复
LS的那个赞一个。
Q_282898034 2008-01-16
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;

class Program
{
static void Main()
{
int n = 50; // 报数人
int m = 3; // 报数范围
Queue<int> num = new Queue<int>(n);
while (n-- > 0)
{
num.Enqueue(n);
for (int i = 1; i < m; i++)
num.Enqueue(num.Dequeue());
}
Console.WriteLine("最后一人是{0}号", num.Count - Array.IndexOf<int>(num.ToArray(), num.Count - 1));
}
}

// 这个报数很像一种翻扑克牌游戏
// 这里假设只剩最后 1 人,然后倒推回 100 人都在
// 受 Queue 右进左出的限制,假设报数是从右往左进行的比较好理解
// 每次在右边补充进去出列的 1 人,就从左边挪出两个人补到右边
// 补充人时, n 表示该人出列的顺序
// 很多人对挪两个人的做法难以理解,那你可以假设有 5 个人报数的情景,
// 3 号出列后,我们让 4 号 5 号挪到队伍开头,然后全队从 1 开始报号
// 这个过程倒推回去就是本程序的想法。

/* 你可以把这段代码加在程序最后,进行验证。

n = num.Count;
int[] result = new int[n];
foreach (int i in num)
result[i] = n--;
foreach (int i in result)
Console.WriteLine("第{0}个人出列.", i);
*/
yinxubest87 2008-01-16
  • 打赏
  • 举报
回复
那应该怎样考虑呢? 直接给方案好了撒````哈
Efcndi 2008-01-16
  • 打赏
  • 举报
回复
@_@ 不是“忽略你的水平”,那个公式能推出来的人不多,我更不行。
不过推荐LZ自己动手去做做看才能加深理解。

具体公式见Donald E.Knuth的《具体数学》1.3节。
k=2时有很明确的公式,k>2时有个推论。

但是我前阵子好像在另一本书上看到一个很简单的解答,晚点在找找看。

第2个的DFS算法我过会给出。

加载更多回复(29)

110,953

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧