编写个小软件

chunjinyumen 2019-01-24 02:32:28
(1)随机生成或者我可以自己输入一个n行22列的数组A,每一行最大值30、最小值1、不重复,n可以1-100
如:
1 3 5 6 7 8 9 10 12 14 16 18 19 20 21 22 23 24 25 26 28 30
1 2 3 4 9 10 11 12 13 14 15 16 17 19 20 21 24 25 27 28 29 30
1 2 4 5 7 8 10 11 13 14 15 17 18 19 22 23 24 26 27 28 29 30
2 3 4 6 7 8 9 12 15 17 18 19 20 21 23 24 25 26 27 28 29 30
2 4 5 6 7 8 9 10 12 14 16 17 18 20 21 22 24 25 26 27 28 29
(2)定义一个1行7列的数组B,也是每一行最大值30、最小值1、不重复:
条件1——数组B在数组A中每一行都最少有5个以上出现;
条件2——数组A中每一行都出现数组B最多有5行;
条件3——数组B,不可能是数组A每一行完全相邻的7个数字。
(3)最终列出这样的数组B有哪一些?

...全文
912 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdonghai 2019-01-28
  • 打赏
  • 举报
回复

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private int gRsCount = 0;//答案个数
private int gBegin = 0;//计时开始
private int[] a;
private int[] v;
private List<string> gLines;

private void dfs(int step)
{
if (gRsCount >= 10) return;//默认只列出10组答案
if (step > 7)
{
StringBuilder s = new StringBuilder(string.Format("{0:D2}",a[1]));
for (int i = 2; i <= 7; i++)
{
s.AppendFormat(string.Format(" {0:D2}", a[i]));
}
string ss = s.ToString();
int iC2 = 0;
for (int i = 0; i < gLines.Count(); i++)
{
string sLine = gLines[i];
int iC1 = 0;
for (int j = 1; j <= 7; j++)
{
if (sLine.IndexOf(string.Format("{0:D2}", a[j]))!=-1)
iC1++;
}
if (iC1 <= 5) return;//不符合条件1
if (iC1 == 7) iC2++;
if (iC2 > 5) return;//不符合条件2
int iPos = sLine.IndexOf(ss);
if (iPos != -1)
if (sLine.Substring(iPos, ss.Length) == ss) return;//不符合条件3
}

textBox2.AppendText(ss + "\r\n");
gRsCount++;
return;
}

for(int i=1;i<=30;i++)//30取7
if (v[i] == 0)
{
a[step] = i;
if (a[step] < a[step - 1]) continue;//按升序组合
v[i] = 1;
dfs(step + 1);
v[i] = 0;
}
}

private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Lines.Count() < 5)
{
MessageBox.Show("数据输入不规范(数据小于5行).");
return;//不符合条件2
}
gLines = new List<string>();
//中间部分是对数据进行规范化处理,每一行数据按升序排列,数据规范为两位,不够两位前面补0
List<int> tmpList = new List<int>();
StringBuilder s = new StringBuilder();
for (int i = 0; i < textBox1.Lines.Count(); i++)
{
string sLine = textBox1.Lines[i];
string[] sArr=sLine.Split(' ');
if (sArr.Length != 22)
{
MessageBox.Show("数据输入不规范(第"+(i+1).ToString()+"行不是22列),请检查.");
return;
}
tmpList.Clear();
for (int j = 0; j < sArr.Length; j++)
{
tmpList.Add(int.Parse(sArr[j]));
}
tmpList.Sort();
s.Clear();
foreach (int k in tmpList)
{
if (k > 30 || k < 1)
{
MessageBox.Show("第"+(i+1).ToString()+"行数据不在1-30之间,请检查.");
return;
}
s.AppendFormat(string.Format("{0:D2} ", k));
}
gLines.Add(s.ToString());
}
s.Clear();
tmpList.Clear();

gRsCount = 0;
textBox2.Text = "";
gBegin = System.Environment.TickCount;
a = new int[50];
v = new int[50];
dfs(1);
textBox2.AppendText("找到 "+gRsCount.ToString()+"个解,用时 " + (System.Environment.TickCount - gBegin).ToString()+"毫秒");
gLines.Clear();
}

}
wdonghai 2019-01-26
  • 打赏
  • 举报
回复
用楼主的测试数据找到下列数据(只列出10组),
不知道符不符合楼主的要求。
02 07 09 10 19 24 28
02 07 09 10 24 28 30
02 07 09 14 19 24 28
02 07 09 14 24 28 30
02 07 10 12 19 24 28
02 07 10 12 24 28 30
02 07 10 19 20 24 28
02 07 10 19 21 24 28
02 07 10 19 24 25 28
02 07 10 20 24 28 30
xuzuning 2019-01-25
  • 打赏
  • 举报
回复
你的 2 4 5 6 7 8 9 10 12 14 16 17 18 20 21 22 24 25 26 27 28 29 并不满足 每一行最大值30、最小值1 的条件
  • 打赏
  • 举报
回复
1、for循环内执行下面代码生成随机排序的数组,当然Enumerable.Range(1,30)这个可以提取到for循环外面
Enumerable.Range(1,30).OrderBy(x=>Guid.NewGuid()).Take(22)
2、Take(22)改成Take(7)就可以,要满足条件,直接以A每行数据作为数据源进行随机,这样可以100%满足条件,如果你觉得这样太难看,那就只Take(5),然后在1~30剩余的数字中再随机Take(2)组成完整的数组
liusa1997 2019-01-24
  • 打赏
  • 举报
回复
实在是没看懂你的条件,对于条件1,就按你的例子,B可以是1,3,5,6,7,*,*或者是其他的,但是条件2是什么?数组A每一行都出现数组B最多5行,但是第一个条件又是数组A每一行数组B都必须出现且最少有5个以上...不矛盾吗??
chunjinyumen 2019-01-24
  • 打赏
  • 举报
回复
允许个别出现4个出现的情况

110,533

社区成员

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

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

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