1、 else am=0; /不选第m件物品 search(m+1); /递归搜索下一件物品 am=1; void checkmax() int i, weight=0, value=0; for(i=0;in;i+) if(ai=1) /如果选取了该物品 weight = weight + wi; /累加重量 value = value + vi; /累加价值 if(weightmax) /且价值大于max max=value; /替换maxvoid readdata() int i; scanf(%d%d,&wi,&vi); /读入第i件物品重量和价值void printresult() pr
2、intf(%d,max);2 装载问题有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。提示:求出不超过c1的最大值max,若总重量max /打印结果int canplace(int,int); /判断该位置能否放置皇后void place(int,int); /在该位置能否放置皇后void takeout(int,int); /把该位置放置皇后去掉int a8; /ai存放第i个皇后的位置=8) /当已经找出一组解时 printresult(); /输出当前结果 for(i=0;8;i+)
3、 /对当前行0到7列的每一个位置 if(canplace(m,i) /判断第m个格子是否能放堡垒 place(m,i); /在(m,i)格子上放置一个皇后 search(m+1); /递归搜索下一行 takeout(m,i); /把(m,i)格子上的皇后去掉 int canplace(int row, int col)row; if(abs(i-row)=abs(ai-col)|ai=col) return(0); return(1);void place(int row, int col) arow=col;void takeout(int row, int col) arow=-1; in
4、t i,j; for(j=0;j=0&rowcolarowcol=0) return 1; return 0;1. Floodfill20的迷宫和一个起点坐标,用广度优先搜索填充所有的可到达的格子。参考第2题。2. 电子老鼠闯迷宫如下图1212方格图,找出一条自入口(2,9)到出口(11,8)的最短路本题给出完整的程序和一组测试数据。状态:老鼠所在的行、列。#includeint search(); /广搜,并在每一个可到达的每一个空格出填上最小步数int emptyopen(); /判栈是否为空:空:1;非空:0。int takeoutofopen(); /从栈中取出一个元素,并把该元素从栈
5、中删除int canmoveto(int,int,int*,int*,int); /判能否移动到该方向,并带回坐标(r,c)int isaim(int row, int col); /判断该点是否是目标int used(int,int); /判断该点是否已经走过void addtoopen(int,int); /把该点加入到open表int a1212; /a存放迷宫,0表示空格,-2表示墙。 /广搜时,未找到目标以前到达的空格,填上到达该点的最小步数int n; /n为迷宫边长,注:若大于12,必须修改一些参数,如a的大小int open20,head,tail,openlen=20; /o
6、pen表 /起点和终点 int number; /读取数据 number=search(); /广搜并返回最小步数,number);int search() int u, row, col, r, c, i, num; while(!emptyopen() /当栈非空 u=takeoutofopen(); row=u/n; /计算该点的坐标 col=u%n; num=arowcol; /取得该点的步数4; if(canmoveto(row,col,&r,&c,i) /判能否移动到该方向,并带回坐标(r,c) if(isaim(r,c) /如果是目标结点 return(num+1); /返回最小
7、步数 if(!used(r,c) /如果(r,c)还未到达过 arc=num+1; /记录该点的最小步数 addtoopen(r,c); int emptyopen() if(head=tail) return(1); return(0);int takeoutofopen() int u;errer: stack is empty return(-1); u=openhead+; head=head%openlen; return(u);int canmoveto(int row, int col, int *p, int *q, int direction) switch(directio
8、n) case 0: c-; break; case 1: r+; case 2: c+; case 3: r-; *p=r; *q=c; if(r=n|c=n) /如果越界返回0 if(arc=0) /如果是空格返回1 return(0); /其余情况返回0int isaim(int row, int col) if(row*n+col=t)int used(int row, int col) if(arowcol=0) / 0表示空格void addtoopen(int row, int col) u=row*n+col; opentail+= u; tail=tail%openlen;
9、int i,j,row,col; char str20; scanf(n);row,&col); /起点坐标 s=row*n+col; /终点坐标 t=row*n+col; gets(str); gets(str); if(strj=.) aij=0; /0表示空格 aij=-2; /2表示墙 head=0; tail=1; open0=s;测试数据如下:12 10 7 1 8XXXXXXXXXXXXX.X.XXXX.X.XX.XX.X.XX.XXX.XX.X.X.XX.XXXXXXXXXXX.X.X.XX.XXX.XXXXX.X.XXXX.XXXX.X.XXXXXXXX.XXX注:测试数据可
10、在运行时粘贴上去(点击窗口最左上角按钮,在菜单中选则“编辑”/“粘贴”即可)。想一想:此程序都存在哪些问题,如果openlen太小程序会不会出错,加入代码使程序能自动报出此类错误。3. 跳马给一个200200的棋盘,问国际象棋的马从给定的起点到给定的终点最少需要几步。Sample Input 0 0 1 1 Sample output 4 状态:马所在的行、列。 /广度优先搜索long takeoutofopen();int a200200,n=200; /a存放棋盘,n为迷宫边长long open2000,head,tail,openlen=2000; /open表1367long s,t;
11、 long u; int row, col, r, c, i, num; /计算该点所在的行 /计算该点所在的列 return -1;int main() /为了让search()显示在一页内和main函数换了以下 /一般的算法程序main函数写在最上面读起来更方便long takeoutofopen() if(arowcol=0) if(head-tail)%openlen=1)open table overflow u=row; u=u*n+col; long row,col;%ld%ld思考:参考第4题,改为用结构体表示状态写此程序。4. 独轮车独轮车的轮子上有5种颜色,每走一格颜色变化一次,独轮车只能往前推,也可以在原地旋转,每走一格,需要一个单位的时间
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1