软件开发实践报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学生实验报告
实验名称:软件开发实践
指导教师:
姓名:
学号:
班级:
日期:
实验报告
姓名: 学号:
一、实验号题目:寻找所有的路径
二、实验的目的和要求:
读懂一段程序的代码,学会里面分析问题的思路,规范自己写代码.在阅读大量源代码的时候,能够提高自己对大的软件的把握能力,快速了解脉络,熟悉细节,不仅仅是编程技巧,还能在程序的架构,设计方面提高自己的能力。
三、算法描述:
你将给的字符串存储在一个矩形格子中。在这个矩形格子寻找一个字符串。出发点可能在格子中任何地方。方向可能向上,下,左,右,或对角的一个字母到下一个字母, 每个格子只能占用一次。你要归还int类型的数来表示所有可能的路径的数目。如果返回结果是超过1,000,000,000,的用-1表示.;
eg:
{"ABC", "FED", "GAI"} "ABCDEA" Returns: 2 {"ABC",
"FED",
"GHI"}
"ABCDEFGHI"
Returns: 1
{"ABC",
"DEF",
"GHI"}
"ABCD"
Returns: 0
{"AAAAA",
"AAAAA",
"AAAAA",
"AAAAA",
"AAAAA"}
"AAAAAAAAA
AA"
Returns: -1
{"ABABA",
"BABAB",
"ABABA",
"BABAB",
"ABABA"}
"ABABABBA"
Returns: 56448
四、源程序清单:
#include
#include
#include
using namespace std; //Required for TopCoder gcc compiler
class WordPath
{
typedef struct POINTtag{
int x;
int y;
int count;
}POS;
typedef vector
public:
int countPaths(vector
{
int findStrLen = find.length();
int gridSize = grid.size();
int gridStrLen = grid[0].length();
vector
int i,j,k;
// 遍历grid中的每一个字符
for ( i = 0; i < gridSize; i ++)
{
for ( j= 0; j < gridStrLen; j++)
{
for ( k=0; k { char ch = find.at(k); //如果与find中位置k的字符相等,则将相应的grid中的位置坐标保存到相应的向量中去 if ( ch == grid[i].at(j) ) { POS ps; ps.x =j; ps.y = i; //位置向量0中所有坐标的初始值为1,而其他位置向量中坐标的这个字段总会被指零后才计算 ps.count = 1; vec[k].push_back(ps); } } } } // 如果有find中的字符在grid中不存在则返回0 for ( k=0; k { if ( vec[k].size() == 0 ) return 0; } VETPOS midVes;//保存当前位置向量中符合条件点的临时向量 // 遍历从位置1开始的位置向量 for ( i = 1; i < findStrLen ; i ++) { midVes.clear(); //遍历当前位置向量中的所有位置坐标 for ( j=0; j < vec[i].size(); j++) { POS cur = vec[i][j]; //如果当前点与前个向量vec[i-1]中的点可以移动到达,则保存这个点到临时变量midVes中去 if ( pathCount(cur,vec[i-1])) { midVes.push_back(cur); } } //清空原来的向量 vec[i].clear(); //如果midVes中有符合条件的点存在,则将它保存到原来的位置向量中去 //否则返回0 if ( midVes.size() >0 ) { vec[i] = midVes; } else { return 0; } } // 统计保存在最后位置向量中的点的count值 int count = 0; for ( j=0; j < vec[findStrLen-1].size(); j++) { POS cur = vec[findStrLen-1][j]; count += cur.count; if (count > 1000000000 ) return -1; } return count;