我正在进行泛洪填充递归分配,我必须读取一个ASCII艺术文本文件并填写。分配可以在这里找到:https://faculty.utrgv.edu/robert.schweller/CS2380/homework/hw10.pdf
Recursion() //construcor
{
column = -1;
row = -1;
grid = new char*[size of art row];
for(int i = 0; i < size of art; i++)
{
board[row] = new char[size of art column]
}
}
我不确定是否应该在构造函数中确定数组的大小。我需要知道数组的大小,以便知道用户想要填充艺术文件的位置。此外,这里是更好的上下文的所有代码。 https://pastebin.com/TSYH26Ci
答案 0 :(得分:1)
我会将您的文件处理为二进制文件。我不知道您正在使用哪种操作系统,API ,所以我会以通用的方式回答......
获取文件大小siz
通常从文件末尾搜索0
个字节会给你文件大小。
分配1D数组dat
来存储整个文件
dat = new BYTE[siz];
将文件加载到内存(1D阵列)
不要忘记使用二进制访问,因为某些ASCII艺术可以使用控制代码( ASCII 低于32),这可能会被文本文件访问损坏。
扫描行尾
所以从0开始扫描你的数组,当你找到 ASCII 代码13
或10
时停止。它的位置将为您提供 ASCII艺术
x
分辨率
int xs;
for (xs=0;xs<siz;xs++)
if ((dat[xs]==10)||(dat[xs]==13))
break;
现在xs
应该持有x
分辨率。
计算y分辨率ys
最安全的方法是计算行尾(13或10)的数量。在这种情况下,您甚至可以将行开始地址存储到某个指针数组BYTE **pixel=new (BYTE*)[ys];
,这将使您能够进行简单的2D访问pixel[y][x]
。如果 ASCII 艺术品已对齐且每行的大小不变,则可以从尺寸计算ys
。
ys = siz/(xs+eol_size)
其中eol_size
为1或2,具体取决于所使用的行结尾:((10),(13),(13,10) or (10,13))
所以:
eol_size=1;
if (xs<siz)
if ((dat[xs+1]==10)||(dat[xs+1]==13))
eol_size=2;
由于我们无权访问任何输入文件,我们只能猜测...如果您需要生成一个,请参阅:
此处 VCL 中的二进制文件访问示例(项目符号#1,#2,#3 ):