- 博客(0)
- 资源 (6)
- 收藏
- 关注
迷宫问题代码(算法详解)
*问题描述:一个网格迷宫由n行m列的单元格组成,每个单元格要么是空地(用1表示),
* 要么是障碍物(用0 表示)。找出从起点到终点的最短移动序列,其中U,D,L,R,
* 分别代表往上,下,左,右移动到相邻单元格。任何时候都不能在障碍格中,
* 也不能走到迷宫之外,起点和终点保证是空地。n,m<=100.
*
*分析: 可以使用bfs,节点的访问顺序恰好是它们从根节点距离从小到大的顺序。类
* 似的,也可以用bfs来按照起点的距离顺序遍历迷宫图。不断沿着父亲指针走,
* 保存方向序列dir,最后反向输出。
* 比深度优化的效率要高很多,因为每次都定义了活结点还有下一个扩展节点,
* 在活结点当中去寻找扩展节点,不会盲目的搜索到底,而是有一定的选择性。
* 因此我们可以定义记录扩展节点的数组,并且定义函数来判断,看下一层将要
* 被搜索的节点是不是能够作为扩展节点。这就运用到了分支限界的知识。
*
2011-06-14
汽车加油问题详细解析及代码
/*问题描述:一辆汽车加满油后可行驶nkm ,旅途中有若干个加油站,设计一个有效的算法,
* 指出应在哪些加油站停靠加油,使沿途加油次数最少。
*算法设计:对于给定的n和k个加油站位置,计算最少加油次数。
* 数据输入;由文件input.txt给出输入数据。第一行有2个正整数n和k,
* 表示汽车加油后可以行驶的nkm,且旅途中有k个加油站,
* 接下来的一行中有k+1个整数,表示第k个加油站与k-1个加油站之间的距离,
* 第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地,
*结果输出:将计算的最少加油次数输出到文件output.txt
* 如果无法到达目的地则输出”no solution“.
* 输入文件示例: 输出文件示例:
* input.txt output.txt
* 7 7 4
* 1 2 3 4 5 1 6 6
部分代码:
void greedy(int d[],int n,int k) {
int num = 0;
int i=0;
int s=0;
for( i = 0;i n) { //当任意的两个加油站之间的距离大于了汽车的最大行驶距离N
cout<<"no solution\n"<<endl;
return;
}
}
for( i = 0,s = 0;i n) {
num++;
s = d[i];
cout<<"加油的站点为: "<<i<<endl<<endl;
}
cout<<"s="<<s<<" ";
cout<<"number="<<num<<endl<<endl;
}
cout<<"最终加油次数为:"<<num<<endl;
}
/* 运行结果:
* 请输入汽车可行驶:
* 7
*
* 加油站的个数:
* 7
*
* 请输入各个站点之间的距离
*
* 第0到1站点的距离为:
* 1
* 第1到2站点的距离为:
* 2
* 第2到3站点的距离为:
* 3
* 第3到4站点的距离为:
* 4
* 第4到5站点的距离为:
* 5
* 第5到6站点的距离为:
* 1
* 第6到7站点的距离为:
* 6
* 第7到8站点的距离为:
* 6
* s=1 number=0
*
* s=3 number=0
*
* s=6 number=0
*
* 加油的站点为: 3
*
* s=4 number=1
*
* 加油的站点为: 4
*
* s=5 number=2
*
* s=6 number=2
*
* 加油的站点为: 6
*
* s=6 number=3
*
* 加油的站点为: 7
*
* s=6 number=4
*
* 最终加油次数为:4
* 请按任意键继续. . .
*
*
2011-06-07
动态规划—最短编辑问题—(非常详细分析以及代码)
*问题描述:设A 和B 是2 个字符串。要用最少的字符操作将字符串A 转换为字符串B。
* 这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符;
* (3)将一个字符改为另一个字符。将字符串A变换为字符串B 所用的最少
* 字符操作数称为字符串A到B 的编辑距离,记为 d(A,B)。试设计一个有效
* 算法,对任给的2 个字符串A和B,计算出它们的编辑距离d(A,B)。
* 例如:
* 输入第一个字符串:
* shao
* 输入第二个字符串:
* shaod
* 最短编辑距离
* 1
(2)本题思路分析
* 定义两个字符串s1 ,s2
* 比较两字符串的某两个相同位置时:(例如s1[i] s2[j] 这时i=j)有三种办法
* 1.把字符ch1变成ch2, 使得s1与s2字符串在该处相同
* 2.删除s1当中的该字符ch1,使得s1与s2字符串在该处相同
* 3.插入某个字符ch2,使得s1与s2字符串在该处相同
运行结果:
* 请输入字符串1
* shao
* 请输入字符串2
* sha1
* d[1][1]= 0 d[1][2]= 1 d[1][3]= 2 d[1][4]= 3
*
* d[2][1]= 1 d[2][2]= 0 d[2][3]= 1 d[2][4]= 2
*
* d[3][1]= 2 d[3][2]= 1 d[3][3]= 0 d[3][4]= 1
*
* d[4][1]= 3 d[4][2]= 2 d[4][3]= 1 d[4][4]= 1
*
* 最短编辑距离为: 1
* 请按任意键继续. . .
2011-06-07
分治法求枚举排序(包含详细解答及分析)
输入n个数,按照字典序从小到大的顺序输出前n个数的所有排列。
核心代码:
void print_permutation(int n, int*a,int cur)
{
int i,j;
if(cur==n) //当存入的数组a的数量到达n时,这时候就可以输出
{
for(i = 0 ; i < n; i++)
printf("%d \t",a[i]);
printf("\n");
}
else
{
for(i = 1; i <= n; i++) //循环变量i是考察当前a[cur],检查i是否在之前被用过
{
int ok=1;
for(j = 0; j < cur ;j++ )//检查cur之前的几位,看是否有与cur相同的项。
if(a[j]==i) ok=0;
if(ok)
{
a[cur] = i; //如果i没有出现在cur之前的几位,那么将cur插入到数组中
print_permutation(n,a,cur+1);//递归调用
}
}
}
}
运行结果:
please input a number
3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
请按任意键继续. . .
2011-06-06
N皇后问题的代码(包含代码分析,能够正确运行)
解答内容的一部分
/*
* cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j]用来判定是否同斜对角线。
* 在数组当中令x代表行,y 代表列,那么y-x代表行与列的差值
*
*
* y y y y y y y y
* ---------------------------
* x | 0 1 2 3 4 5 6 7
* x | -1 0 1 2 3 4 5 6
* x | -2 -1 0 1 2 3 4 5
* x | -3 -2 -1 0 1 2 3 4
* x | -4 -3--2 -1 0 1 2 3
* x | -5 -4 -3 -2 -1 0 1 2
* x | -6 -5 -4 -3 -2 -1 0 1
* x | -7 -6 -5 -4 -3 -2 -1 0
*
*
2011-06-06
C#软件项目开发全程剖析
全面透视sharp develop软件的开发内幕。展示了.NET高级技巧,告诉读者如何从头到尾的实现各种界面和功能的开发。国外作者编著,由清华大学出版。
2011-06-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人