大家如果对算法导论以及其他信息感兴趣,可以加入学习交流群一起交流 948097478
1.使用STL库实现杨辉三角系数求解。
设计思想:
如下图,可通过队列的出队元素和队首元素之和的方式得到入队元素的值,而且在操作次数逐渐递增的情况下得到相应第n行的元素。
源代码:
#include<queue>
#include<iostream>
#include<iomanip>
using namespace std;
void tri(int n){
queue<int>q;
q.push(0);
q.push(1);
int s, e;
for (int i = 0; i<n; i++)
{
q.push(0);
for (int j = n; j>i; j--)
cout <<setw(3)<< " ";
do
{
s = q.front();
q.pop();
e = q.front();
e != 0 ? cout<< setw(5)<<e << " " : cout << " ";
q.push((s + e));
} while (e != 0);
cout << endl;
}
}
int main(){
cout << "请输入杨辉三角的行数" << endl;
int n;
cin >> n;
tri(n);
return 0;
}
运行结果:
2.使用STL库实现迷宫求解。
设计思想:
将迷宫设计为一个二维数组,用1表示不可通,0表示可通,另外用栈存放路径,如果该位置走不通,就将该位置出栈。在当前位置判断四周(上下左右)是否有可通路段,如果有,则移动,如果都不可通,则返回上一步所在位置。
#include<stdio.h>
#include<iostream>
#include<stack>
#include<iterator>
using namespace std;
bool map[11][11] = {
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 0, 1, 1, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 0, 0, 1, 0, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 1, 1, 0, 1 },
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
};//设定地图,1表示障碍物,0表示无障碍,假设初始位置在(1,1),终点位置在(8,8)
int flag[11][11] = {
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};//存放该位置是否已存入路径,1为已存入,0为未存入,-1表示走过但不在路径
class migong{
public:
int positionx = 1;
int positiony = 1;
int IsRoundAccess();//判断周围有无障碍
bool IsEnd();//判断是否到达终点
void Print();//打印当前位置
};
struct node{
int x=1, y=1;
}pre;
stack<node>s;
int migong::IsRoundAccess(){
if (map[positionx - 1][positiony] == 0 && flag[positionx - 1][positiony] == 0) return 1;//上方是通路且未走过
else if (map[positionx + 1][positiony] == 0 && flag[positionx + 1][positiony] == 0) return 2;//下方是通路且未走过
else if (map[positionx][positiony - 1] == 0 && flag[positionx][positiony - 1] == 0) return 3;//左方是通路且未走过
else if (map[positionx][positiony + 1] == 0 && flag[positionx][positiony + 1] == 0) return 4;//右方是通路且未走过
else return 0;
}
bool migong::IsEnd(){
if (positionx == 8 && positiony == 8) return 1;
else return 0;
}
void migong::Print(){
printf("( %d ,%d )->", positionx, positiony);
/*while (!s.empty()){
pre = s.top();
cout << "(" << pre.x << "," << pre.y << ")" << "->";
s.pop();
} */
}
void start(int x,int y){
int p;
migong m;
m.positionx = x;
m.positiony = y;
if (map[x][y] == 1){
cout << "该位置不能作为入口!" << endl;
return;
}
flag[x][y] = 1;
pre.x = m.positionx;
pre.y = m.positiony;
//s.push(pre);
m.Print();
while (!(m.IsEnd())){//判断是否到达终点
p = m.IsRoundAccess();
if (p == 1) {//如果上方为通路且未走过,走到上方一格,并将上方的坐标存入栈中
pre.x = m.positionx--;
s.push(pre);
m.Print();
flag[m.positionx][m.positiony] = 1;
}
else if (p == 2) {//如果下方为通路且未走过,走到上方一格,并将下方的坐标存入栈中
pre.x = m.positionx++;
s.push(pre);
m.Print();
flag[m.positionx][m.positiony] = 1;
}
else if (p == 3) {//如果左方为通路且未走过,走到上方一格,并将左方的坐标存入栈中
pre.y = m.positiony--;
s.push(pre);
m.Print();
flag[m.positionx][m.positiony] = 1;
}
else if (p == 4) {//如果右方为通路且未走过,走到上方一格,并将右方的坐标存入栈中
pre.y = m.positiony++;
s.push(pre);
m.Print();
flag[m.positionx][m.positiony] = 1;
}
else{//如果上下左右四个方位都走过/是阻碍物,则返回到上一步
flag[m.positionx][m.positiony] = -1;//将当前位置标注为-1,以免重复走
s.pop();//将当前位置移出栈
pre=s.top();//得到上一步坐标
m.positionx = pre.x;//返回上一步
m.positiony = pre.y;//返回上一步
}
}
//m.Print();
}
int main(){
int x, y;
printf("输入入口坐标:");
cin >> x;
cin >> y;
printf("走迷宫游戏:\n");
start(x,y);
printf("\n");
return 0;
}
运行结果
有兴趣可以加群一起讨论:948097478