发现递归返回值的问题后,发现只有在每次递归生成一组sample(代表数独的第一行)后,立即根据这个sample生成完整的数独,然后直接写入就行了。
int[,] ans = new int[9, 9]; int[] shift = { 0, 3, 6, 7, 4, 1, 2, 5, 8 }; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { ans[i, j] = sample[(j + shift[i]) % 9]; } }
上面的代码就能根据第一行的数生成的完整的数独。
接下来是写入的问题,这个地方却是耗费我颇多功夫。毕竟刚开始接触C#。在菜鸟的C#的新手教程里,它提供的一种文件输入方式是filestream的输入方式,这种以二进制的输入方式我一时也没有掌握诀窍。一个一个去转换成二进制再写入,感觉不是很优雅。后面在网上找到了C#的streamwriter的写入方式,以字符串的方式写入。其实还是一个个的将int型的数字转换成了一个个字符然后再写入。其实与二进制写入也没有什么区别,但是可能主观上觉得字符串更加亲近一点吧!
但是一开始的时候文件输入也没有处理的好,运行时直接报错了,提示我生成的“out.txt”已被某一进程占用,不能使用。
问题代码在这
public static void Write_txt(int[,] ans) { StreamWriter sw = new StreamWriter("out.txt", true, Encoding.Default); sw.WriteLine("{0}",Count.count); for(int i=0;i<9;i++) { for (int j = 0; j < 9; j++) { sw.Write(ans[i, j].ToString() + " "); } sw.WriteLine(); } }
我以全局的方法去写文件,传入的是ans二维数组然后直接写入。问题也出在这,这个方法被多次使用,所以这个文件被打开多次,所以第二次打开的时候就开始报错了。现在觉得问题很明显,当时却死活也不知道为什么会报错很难受。后面看了一下别人是怎么解决这个问题的,然后在函数末尾加上了两句关闭文件的语句成功的解决了这个问题。
public static void Write_txt(int[,] ans) { StreamWriter sw = new StreamWriter("out.txt", true, Encoding.Default); sw.WriteLine("{0}",Count.count); for(int i=0;i<9;i++) { for (int j = 0; j < 9; j++) { sw.Write(ans[i, j].ToString() + " "); } sw.WriteLine(); } sw.Flush(); sw.Close();//添加的两句 }
然后程序能够成功运行了,但是问题还是很严重,太慢了,比蜗牛还慢,跑了半小时只跑了40万个点。