110,533
社区成员
发帖
与我相关
我的任务
分享
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();
}
}
Enumerable.Range(1,30).OrderBy(x=>Guid.NewGuid()).Take(22)
2、Take(22)改成Take(7)就可以,要满足条件,直接以A每行数据作为数据源进行随机,这样可以100%满足条件,如果你觉得这样太难看,那就只Take(5),然后在1~30剩余的数字中再随机Take(2)组成完整的数组