继续昨天的博客

  发现递归返回值的问题后,发现只有在每次递归生成一组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万个点。

posted on 2018-04-09 16:32  好好学习呀)  阅读(77)  评论(0编辑  收藏  举报