关于控制台数组的问题 本帖最后由 michaela_soul 于 2013-04-18 20:16:03 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我从网上下了个数独游戏的代码。using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace GameMath{ class Program { static void Main(string[] args) { DateTime time1 = DateTime.Now; GameMath gm = new GameMath(); gm.Intial(); gm.Creat(); DateTime time2 = DateTime.Now; Console.WriteLine(time2 - time1); } } class GameMath { private int[,] map; private Stack<StackContent> mapStack;//用来保存数组状态的栈 private List<int[,]> resuleMap;//用来保存正确的数独结果的List public void Intial() { mapStack = new Stack<StackContent>(); resuleMap = new List<int[,]>(); //初始化数组 map=new int[10,10]; for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { map[i,j] = 0; } } map[1, 1] = 5; map[1, 2] = 3; map[2, 2] = 1; map[3, 3] = 9; map[2, 4] = 7; map[2, 5] = 2; map[3, 6] = 6; map[2, 8] = 8; map[3, 8] = 3; map[4, 2] = 9; map[4, 3] = 7; map[5, 1] = 3; map[5, 2] = 2; map[4, 4] = 6; map[5, 5] = 4; map[6, 5] = 5; map[4, 9] = 3; map[6, 9] = 2; map[8, 3] = 4; map[7, 4] = 4; map[9, 5] = 3; map[7, 7] = 2; map[9, 8] = 1; } //产生数独的算法 public void Creat() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { //如果该单元格已经有初始值,则跳过 if (map[i, j] != 0) { continue; } for (int num = 1; num <= 9; num++) { //如果合法,则放入数 if (Valid(i, j, num)) { map[i, j] = num; //合法状态压入状态栈 StackContent sc = new StackContent(i, j, map); mapStack.Push(sc); if (i == 9 && j == 9) { //此时,整个数组填完,到达终态,找到一个合法的 PrintResult(); Console.WriteLine(); //将该合法的结果存入结果List中 int[,] validMap = new int[10, 10]; for (int i1 = 1; i1 <= 9; i1++) { for (int j1 = 1; j1 <= 9; j1++) { validMap[i1, j1] = map[i1, j1]; } } resuleMap.Add(validMap); //状态栈回退,将当前状态回退到以前的状态,找其他的合法终态 if (mapStack.Count != 0) { StackContent oldersc = mapStack.Pop(); i = oldersc.i; j = oldersc.j; map = oldersc.map; num = map[i, j]; map[i, j] = 0; } //如果回退后状态无法继续进行,则回退到可以为止 while (num == 9) { if (mapStack.Count != 0) { StackContent oldersc = mapStack.Pop(); i = oldersc.i; j = oldersc.j; map = oldersc.map; num = map[i, j]; map[i, j] = 0; } else { return; } } ////////////////////////////////////////////////// } //与if (i == 9 && j == 9)对应,没有到达终态时,继续往下填数 else { break; } } else { //该位置数字1到9都不合法,说明上一个状态也不对,回退重新生成上一状态 while (num == 9) { if (mapStack.Count != 0) { StackContent oldersc = mapStack.Pop(); i = oldersc.i; j = oldersc.j; map = oldersc.map; num = map[i, j]; map[i, j] = 0; } else { return; } } } } } } } //判断在一个单元格中放入数是否合法 public bool Valid(int i, int j, int num) { //判断同一行中 for (int jj = 1; jj <= 9; jj++) { if (map[i, jj] == num) { return false; } } //判断同一列中 for (int ii = 1; ii <= 9; ii++) { if (map[ii, j] == num) { return false; } } //判断其所在的单元格中 for (int ii = ((i-1 )/ 3 )*3+ 1; ii <= ((i-1 )/ 3)*3 + 3; ii++) { for (int jj = ((j-1) / 3)*3 + 1; jj <= ((j-1 )/ 3)*3 + 3; jj++) { if (map[ii,jj] == num) { return false; } } } //判断当前状态是否已经是存入结果中的,如果已经存在,则视为不合法,避免重复 if (i == 9 && j == 9) { return !AlreadyInResultList(); } return true; } //判断当前状态是否已经是存入结果List中 public bool AlreadyInResultList() { bool equal = false; foreach (int[,] result in resuleMap) { //遍历结果List,判断当前状态是否已存入该List equal = true; for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if(map[i,j]!=result[i,j]) { equal = false; break; } } if (!equal) { break; } } if(equal) { return true; } } return equal ; } //打印结果 public void PrintResult() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { Console.Write(map[i, j] + " "); } Console.WriteLine(); } } //数组状态栈中保存的节点类 class StackContent { public int i{get;set;} public int j { get; set; } public int[,] map { get; set; } public StackContent(int i, int j, int[,] externalMap) { this.i = i; this.j = j; map = new int[10, 10]; for (int i1 = 1; i1 <= 9; i1++) { for (int j1 = 1; j1 <= 9; j1++) { this.map[i1, j1] = externalMap[i1, j1]; } } } } }}然后我想让它支持输入,我就加了后面的那一段。。结果输出是不对的 现在机器上没vs环境,否则给你调试一下下面这个是我以前做的数独游戏,不知道对你有没有用http://download.csdn.net/detail/gxingmin/4216131 DataGridView数据显示的问题 多线程数据重复插入怎么办? 怎么把登入界面时的 用户名 ,在后来的存储中,一起存入 数据库 关于SQL 2005数据库存取数据的问题。 多条数据组合 如何在table中添加image? C# 中Sql语句的问题,在线等~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 激活Winform窗体 有点难度,DataGriD的行操作,如何设置在一CELL中显示多行文本内容. 字符串问题,谢谢 问个关于常量和方法的菜鸟问题! 菜鸟在程序理解上的疑惑,各位大哥大姐大嫂大大们帮帮忙呗
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace GameMath
{
class Program
{
static void Main(string[] args)
{
DateTime time1 = DateTime.Now;
GameMath gm = new GameMath();
gm.Intial();
gm.Creat();
DateTime time2 = DateTime.Now;
Console.WriteLine(time2 - time1);
}
}
class GameMath
{
private int[,] map;
private Stack<StackContent> mapStack;//用来保存数组状态的栈
private List<int[,]> resuleMap;//用来保存正确的数独结果的List
public void Intial()
{
mapStack = new Stack<StackContent>();
resuleMap = new List<int[,]>();
//初始化数组
map=new int[10,10];
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= 9; j++)
{
map[i,j] = 0;
}
}
map[1, 1] = 5; map[1, 2] = 3; map[2, 2] = 1; map[3, 3] = 9; map[2, 4] = 7;
map[2, 5] = 2; map[3, 6] = 6; map[2, 8] = 8; map[3, 8] = 3; map[4, 2] = 9;
map[4, 3] = 7; map[5, 1] = 3; map[5, 2] = 2; map[4, 4] = 6; map[5, 5] = 4;
map[6, 5] = 5; map[4, 9] = 3; map[6, 9] = 2; map[8, 3] = 4; map[7, 4] = 4;
map[9, 5] = 3; map[7, 7] = 2; map[9, 8] = 1;
} //产生数独的算法
public void Creat()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= 9; j++)
{
//如果该单元格已经有初始值,则跳过
if (map[i, j] != 0)
{
continue;
}
for (int num = 1; num <= 9; num++)
{
//如果合法,则放入数
if (Valid(i, j, num))
{
map[i, j] = num;
//合法状态压入状态栈
StackContent sc = new StackContent(i, j, map);
mapStack.Push(sc);
if (i == 9 && j == 9)
{
//此时,整个数组填完,到达终态,找到一个合法的
PrintResult();
Console.WriteLine();
//将该合法的结果存入结果List中
int[,] validMap = new int[10, 10];
for (int i1 = 1; i1 <= 9; i1++)
{
for (int j1 = 1; j1 <= 9; j1++)
{
validMap[i1, j1] = map[i1, j1];
}
}
resuleMap.Add(validMap); //状态栈回退,将当前状态回退到以前的状态,找其他的合法终态
if (mapStack.Count != 0)
{
StackContent oldersc = mapStack.Pop();
i = oldersc.i;
j = oldersc.j;
map = oldersc.map;
num = map[i, j];
map[i, j] = 0;
}
//如果回退后状态无法继续进行,则回退到可以为止
while (num == 9)
{
if (mapStack.Count != 0)
{
StackContent oldersc = mapStack.Pop();
i = oldersc.i;
j = oldersc.j;
map = oldersc.map;
num = map[i, j];
map[i, j] = 0;
}
else
{
return;
}
}
//////////////////////////////////////////////////
}
//与if (i == 9 && j == 9)对应,没有到达终态时,继续往下填数
else
{
break;
}
}
else
{
//该位置数字1到9都不合法,说明上一个状态也不对,回退重新生成上一状态
while (num == 9)
{
if (mapStack.Count != 0)
{
StackContent oldersc = mapStack.Pop();
i = oldersc.i;
j = oldersc.j;
map = oldersc.map;
num = map[i, j];
map[i, j] = 0;
}
else
{
return;
}
}
}
}
}
}
}
//判断在一个单元格中放入数是否合法
public bool Valid(int i, int j, int num)
{
//判断同一行中
for (int jj = 1; jj <= 9; jj++)
{
if (map[i, jj] == num)
{
return false;
}
}
//判断同一列中
for (int ii = 1; ii <= 9; ii++)
{
if (map[ii, j] == num)
{
return false;
}
}
//判断其所在的单元格中
for (int ii = ((i-1 )/ 3 )*3+ 1; ii <= ((i-1 )/ 3)*3 + 3; ii++)
{
for (int jj = ((j-1) / 3)*3 + 1; jj <= ((j-1 )/ 3)*3 + 3; jj++)
{
if (map[ii,jj] == num)
{
return false;
}
}
}
//判断当前状态是否已经是存入结果中的,如果已经存在,则视为不合法,避免重复
if (i == 9 && j == 9)
{
return !AlreadyInResultList();
}
return true;
} //判断当前状态是否已经是存入结果List中
public bool AlreadyInResultList()
{
bool equal = false;
foreach (int[,] result in resuleMap)
{
//遍历结果List,判断当前状态是否已存入该List
equal = true;
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= 9; j++)
{
if(map[i,j]!=result[i,j])
{
equal = false;
break;
}
}
if (!equal)
{
break;
}
}
if(equal)
{
return true;
}
}
return equal ;
}
//打印结果
public void PrintResult()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= 9; j++)
{
Console.Write(map[i, j] + " ");
}
Console.WriteLine();
}
} //数组状态栈中保存的节点类
class StackContent
{
public int i{get;set;}
public int j { get; set; }
public int[,] map { get; set; }
public StackContent(int i, int j, int[,] externalMap)
{
this.i = i;
this.j = j;
map = new int[10, 10];
for (int i1 = 1; i1 <= 9; i1++)
{
for (int j1 = 1; j1 <= 9; j1++)
{
this.map[i1, j1] = externalMap[i1, j1];
}
}
}
}
}
}然后我想让它支持输入,我就加了后面的那一段。。结果输出是不对的
下面这个是我以前做的数独游戏,不知道对你有没有用
http://download.csdn.net/detail/gxingmin/4216131