首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

急算法题,好心人解答.该如何解决

2012-02-01 
急!!算法题,好心人解答.题目是这样的.给出7个数字(数组),数字的范围是0-13.除了0是不确定个数的,其它数字

急!!算法题,好心人解答.
题目是这样的.
给出7个数字(数组),数字的范围是0-13.除了0是不确定个数的,其它数字最多出现1次.0能转化成1-13中的任何以个数字.
写除算法能判断7个数字中有5个连续数.
例如   0,1,2,3,5,7,10.     0-> 4     就变成1,2,3,4,5,7,10   那就返回   true
0,0,3,8,6,10,13               0-> 7,0-> 9就变成   3,6,7,8,9,10,13   返回   true.
如果没有连续的5个数也不能靠0的变化来拼成连续的5个数就返回   false.


急啊   ,在线等...高手相助

[解决办法]
for example:

bool NumberGame(int[] array)
{
//如果不足7位返回
if (array.Length != 7) return false;
//将不为零的元素添加到一个列表中
List <int> list = new List <int> ();
foreach (int i in array)
{
if (i != 0)
{
list.Add(i);
}
}
list.Sort();
//零的个数
int zeroCount = 7 - list.Count;
//如果零的个数大于等于4,肯定满足条件,返回true
if (zeroCount > = 4) return true;
//定义一个间隔数组
int[] interval = new int[list.Count - 1];
for (int i = 0; i < list.Count - 1; i++)
{
interval[i] = list[i + 1] - list[i] - 1;
}
//求最小间隔数
int min = int.MaxValue;
for (int i = 0; i < 3; i++)
{
int total = 0;
for (int j = 0; j < 5 - zeroCount - 1; j++)
{
total += interval[j];
}
min = (total < min) ? total : min;
}
if (min <= zeroCount)
return true;
else
return false;
}

初步测试了下,好像可以..
你自己再试试看..

测试如下:

static void Main(string[] args)
{
Console.WriteLine( "请输入7个小于13的整数,且以逗号分隔: ");
string str = Console.ReadLine();
while (str != "exit ")
{
string[] s = str.Split( ', ');
if (s.Length == 7)
{
int[] array = new int[7];
for (int i = 0; i < 7; i++)
{
array[i] = Convert.ToInt32(s[i].Trim());
}
if (NumberGame(array))
{
Console.WriteLine( "满足条件 ");
}
else
{
Console.WriteLine( "不满足条件 ");
}
}
str = Console.ReadLine();
}
}
static bool NumberGame(int[] array)
{
//如果不足7位返回
if (array.Length != 7) return false;
//将不为零的元素添加到一个列表中
List <int> list = new List <int> ();
foreach (int i in array)
{
if (i != 0)
{
list.Add(i);
}
}
list.Sort();
//零的个数
int zeroCount = 7 - list.Count;
//如果零的个数大于等于4,肯定满足条件,返回true
if (zeroCount > = 4) return true;
//定义一个间隔数组
int[] interval = new int[list.Count - 1];
for (int i = 0; i < list.Count - 1; i++)


{
interval[i] = list[i + 1] - list[i] - 1;
}
//求最小间隔数
int min = int.MaxValue;
for (int i = 0; i < 3; i++)
{
int total = 0;
for (int j = 0; j < 5 - zeroCount - 1; j++)
{
total += interval[j];
}
min = (total < min) ? total : min;
}
if (min <= zeroCount)
return true;
else
return false;
}
[解决办法]
private bool fCalc(int[] iParams, int iMaxNum)
{
int[] vNumCounts = new int[iMaxNum];
foreach (int vValue in iParams)
if (vValue < iMaxNum)
vNumCounts[vValue]++;

/*---
1,2,3,4,5
2,3,4,5,6
3,4,5,6,7
4,5,6,7,8
5,6,7,8,9
...
---*/

int vMinSpace = 5; // 最小空隙数//促成连续5个时缺少的个数
for (int i = 1; i <= iMaxNum - 5; i++)
{
int vTemp = 0;
for (int j = 0; j <= 4; j++)
if (vNumCounts[i + j] == 0)
vTemp++;
if (vTemp < vMinSpace)
vMinSpace = vTemp;
}
return vMinSpace - vNumCounts[0] <= 0; // 最小空隙数和可填补的数小于0
}
private void button4_Click(object sender, EventArgs e)
{
int[] vArray1 = { 0, 1, 2, 3, 5, 7, 10 };
textBox1.Clear();
textBox1.AppendText( "{ 8, 1, 2, 3, 5, 7, 10 }\r\n ");
textBox1.AppendText(fCalc(vArray1, 14).ToString() + "\r\n ");
int[] vArray2 = { 0, 0, 3, 8, 6, 10, 13 };
textBox1.AppendText( "{ 0, 0, 3, 8, 6, 10, 13 }\r\n ");
textBox1.AppendText(fCalc(vArray2, 14).ToString() + "\r\n ");
}

热点排行