- 豆豆staR
-
火烧连营问题
1.需求规格说明
“火烧连营”是三国演义中的著名典故之一广为流传,假定文本文件c1.txt 是火烧连营中的军营分布图,每个字符A 代表一个营帐,营帐是可燃物,其他字符代表不可燃的空白地段,文件共有40 行70 列,请你编写程序,读入该文件的内容,再从键盘输入任意点的x 和y值(x<70,y<40)作为着火点,“火烧连营”后,被燃烧的营帐标上字符"X",并把整个结果输出到文件c2.txt 中。
2.总体分析与设计
(1)设计思想:
用一个char型二维数组存储文件中的40*70的数据,然后根据这个二维数组确定要点火的点,并将这个点放入到一个栈,并判断其周围的点是否是A,是A的话则换成X并将这个点放入栈中,直到栈空为止。
3.编码
对于边界的处理类比书上的迷宫问题,加一圈围墙,而对于每一行的最后在加上一个换行符“ ”。
另外,在读取文件的时候由于没有考虑到文本本来就有换行符,用的Get函数一个个读取,每一行都多读了一个换行符,导致出错。
4.程序及算法分析
5.小结
在程序设计时考虑不是很严密,导致出现很多问题。
6.附录
核心代码:
//fire.h
#include "stack.h"
#include <fstream>
using namespace std;
class Position
{
friendclass Fire;
private:
intx;
int y;
};
classFire
{
public:
Fire()
{
for(int i = 0; i < 72; i++)//设置围墙
{
tent[0][i] = "X";
tent[41][i] = "X";
}
for(int j = 0; j < 42; j++)
{
tent[j][0] = "X";
tent[j][71] = " ";
}
}
voidOpenfile();
voidFireposition(int xx,int yy);
voidSave();
private:
voidFireUp(Position &p)
{
if(tent[p.x][p.y+1] == "A")
{
tent[p.x][p.y+1] = "X";
here.x = p.x;
here.y = p.y+1;
temp.Add(here);
}
}
voidFireDown(Position &p)
{
if(tent[p.x][p.y-1] == "A")
{
tent[p.x][p.y-1] = "X";
here.x = p.x;
here.y = p.y-1;
temp.Add(here);
}
}
voidFireLeft(Position &p)
{
if(tent[p.x-1][p.y] == "A")
{
tent[p.x-1][p.y] = "X";
here.x = p.x-1;
here.y = p.y;
temp.Add(here);
}
}
voidFireRight(Position &p)
{
if(tent[p.x+1][p.y] == "A")
{
tent[p.x+1][p.y] = "X";
here.x = p.x+1;
here.y = p.y;
temp.Add(here);
}
}
chartent[42][72];
Stack<Position>temp;
Positionhere;//当前着火点
};
Fire.cpp
#include "stdafx.h"
voidFire::Openfile()
{
ifstreamreadfile;
readfile.open("D:\c1.txt");
charline[80];
for(int i = 1;i<=40;i++)
{
readfile.getline(line,80," ");
for(int j = 1;j<=70;j++)
tent[i][j] = line[j-1];
}
readfile.close();
}
voidFire::Fireposition(int xx,int yy)
{
Openfile();
if(tent[xx][yy] == "A")
{
tent[xx][yy] = "X";
here.x = xx;
here.y = yy;
temp.Add(here);
}
Position t;
while(!temp.IsEmpty())
{
temp.Delete(t);
FireUp(t);
FireDown(t);
FireLeft(t);
FireRight(t);
}
Save();
}
voidFire::Save()
{
ofstreamwritefile;
writefile.open("D:\c2.txt");
for(int i = 1; i <= 40; i++)
{
for(int j = 1; j <= 71; j++)
//writefile.put(tent[i][j]);
writefile<<tent[i][j];
}
writefile.close();
}
- 黑桃云
-
你是谁? 是不是地大信工的?
- 贝贝
-
哈哈 肯定信工的
- 皮皮
-
地大的??