算法设计与分析---回溯实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《算法设计与分析》实验报告实验三回溯法
3.迷宫问题
一天Luna在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,. 和#,前者表示可以通行后者表示不能通行。

同时当Luna处在某个格点时,她只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Luna想要从点A走到点B(不能走出迷宫)。

如果起点或者终点有一个不能通行(为#),则看成无法办到。

[输入]
第1行是测试数据的组数k,后面跟着k组输入。

每组测试数据的第1行是一个正整数n (1 <= n <= 100),表示迷宫的规模是n * n 的。

接下来是一个n * n的矩阵,矩阵中的元素为. 或者#。

再接下来一行是4个整数ha, la, hb, lb,描述A处在第ha行, 第la列,B处在第hb 行, 第lb列。

注意到ha, la, hb, lb全部是从0开始计数的。

1.八皇后问题
1.1解题思路
八皇后问题的解法,很简单的解法。

通过回溯实现枚举。

对于当前行,尝试是否可在当前列放置皇后,然后进入下一行的尝试,同时尝试完毕以后,要将当前行回复(回溯),来进行下一次尝试。

到达最后一行的时候,即递归结束条件,打印结果即可。

1.2程序运行情况
1.3所有的皇后解
见附录。

(毕竟92个解...)
1.4程序源码(含注释)
2. 24点问题
2.1 解题思路
这题虽然使用dfs很简单,但是有一点思维在里面。

我很惭愧,自己没有想出来怎么如意的独立AC此题。

遇到的最大的问题——如何插入括号?枚举插入、和运算符一同排列都不靠谱。

解决方法是:用同等的办法转化。

每一次从待组合的是数字中,任取两个数,随机用运算符计算完毕后,再放回去。

下一次计算,再次重复这个过程,可以等价为有括号的运算方式了。

遇到第二个问题——如何实现这种“任取两个数”的选择方式。

这里就直接体现出了我个人能力的不足。

居然没想到。

尝试使用STL的set,但是没成功。

这里借鉴了网上的AC 思路,我感到自己思维太僵硬。

解决方法是——对于当前的运算状态中,用两个循环实现枚举两个数,计算为完毕以后,结果覆盖在数组序号小的那个数的位置,再将第二个数与最后一个数字交换即可进入下一个状态。

回溯的时候,只需要回复小序号的数字的位置的值,以及再一次swap即可。

(因为第二个数字只是swap却没有改变过内容)。

一个细节问题,就是加法和乘法是没有顺序的,减法和除法是有顺序的,以及除法要考虑0异常。

一共是6次枚举即可。

2.2 测试样例
5 5 5 1
ans is YES
1 1 4 2
ans is :NO
2.3 程序运行情况
样例一:
2.4 程序源码(含注释)
#include"bits/stdc++.h"
using namespace std;
#define inf 5
#define eps 1e-6 //精度
bool ans;//结果,是否可以
double data[inf];//存放输入
void init() //初始化
{
ans=false;
}
void input() //输入数据
{
printf("input the four number: ");
scanf("%lf%lf%lf%lf",&data[1],&data[2],&data[3],&data[4]);
printf("waiting ...\n\n");
}
void dfs(int n)//参数是当前计算队列的个数
{
if(ans)return;//如果可以,直接结束吧
if(n==1)//判断结果
{
if(fabs(data[n]-24)<eps)ans=true;//精度以内,一定要加绝对值
return;
}
for(int i=1;i<n;i++) //随便取某两个数字,加减法之后放入原位置中替换,再回溯
for(int j=i+1;j<=n;j++)
4 1
ans is yes
4
#..#
.#.#
.###
....
1 2
4 1
ans is no
3.3 程序运行情况
样例一:
样例二:
样例三:样例四:
3.4 程序源码(含注释)
#include"bits/stdc++.h"
using namespace std;
#define inf 999
int n,sx,sy,gx,gy;//地图长宽,与起点终点坐标
char e[inf][inf];//地图
int book[inf][inf];//标记地图
bool ans;//最后的结果
int pos[4][2]={-1,0,1,0,0,1,0,-1};//方位,上下右左
void read()//输入数据
{
printf("input the row of the map:");
scanf("%d",&n);
printf("input the map now:\n");
for(int i=0;i<n;i++)
scanf("%s",e[i]);
printf("now input the point:\n");
scanf("%d%d%d%d",&sx,&sy,&gx,&gy);
sx--;
sy--;
gx--;
gy--;
printf("\n");。

相关文档
最新文档