递归专题
汉诺塔
汉诺塔
#include<iostream>
#include<stdio.h>
using namespace std;
void move(int n, char from, char to, char helper) {
if (n == 1)
cout << from << "->" << to << endl;
else {
move(n - 1, from, helper, to);//在这一步已经层层剥离出理解为从第2层到第n层的步骤集合
move(1, from, to, helper);//这才是真正移动的那一步,应该是移动的底层
move(n - 1, helper, to, from);
}
}
int main() {
int num = 0;
cin >> num;
move(num, 'A', 'C', 'B');
return 0;
}
红与黑
//红与黑
#include<iostream>
using namespace std;
int x=0; int y=0;
char a[21][21];
int dp[21][21];
int cnt=0;
void f(int i, int j) {
dp[i][j] = 1;
if(i>0&&dp[i-1][j]==0&&a[i-1][j]=='.')
{
cnt++; f(i - 1, j);
}
if ((i + 1 < x)&&dp[i + 1][j] == 0 && a[i + 1][j]== '.') {
cnt++; f(i + 1, j);
}
if (j + 1 < y&&dp[i][j + 1] == 0 && a[i][j + 1] == '.') {
cnt++; f(i, j + 1);
}
if (j > 0 && dp[i][j - 1] == 0 && a[i][j - 1] == '.') {
cnt++; f(i, j - 1);
}
}
int main() {
int x1, y1;
while (1) {
cin >> y >> x;
cnt = 1;
if (x == 0)break;
for (int i = 0; i <= x; i++)
for (int j = 0; j <= y; j++)
dp[i][j] = 0;
for (int i = 0; i < x; i++)
cin >> a[i];
for(int i=0;i<x;i++)
for (int j = 0; j < y; j++) {
if (a[i][j] == '@') {
x1 = i;
y1 = j; break;
}
}
f(x1, y1);
cout << cnt << endl;
}return 0;
}
猴子分苹果
//猴子分苹果
#include<iostream>
#include<stdio.h>
using namespace std;
int monkeynum;
int n; int k; int temp;
long function(int monkey_id) {
for (int last = 1;; last++) {
temp = 0;
if (monkey_id == n)
return monkey_id * last + k;
else {
temp = function(monkey_id + 1);
if (temp % (monkeynum - 1) == 0)
return monkeynum * temp / (monkeynum - 1) + k;
else
break;
}
}
}
int main()
{
cin >> n >> k;
monkeynum = n;
cout << function(1);
return 0;
}
二叉树
//二叉树
#include<iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int i = 1; int j = 1;
int a_[500]; int b_[500];
while (a > 0) {
a_[i++] = a / 2;
a = a / 2;
}
while (b > 0) {
b_[j++] = b / 2;
b = b / 2;
}
if (a > b) {
for (int k=1;k<=j;k++)
for(int q=1;q<=i;q++)
if (a_[q] == b_[k]) {
cout << a_[q]; return 0;
}
}
else {
for (int q = 1; q <= i; q++)
for (int k = 1; k <= j; k++) {
if (a_[q] == b_[k]) {
cout << a_[q]; return 0;
}
}
}return 0;
}
指针基础
//指针实现数组输入和输出
#include<iostream>
using namespace std;
int main() {
int*p; int a[20];
p = a;
int sum = 0;
float *p_end;
p_end = p + n - 1;//基本的指针定义方法
for (p;p<=p_end;p++)//基本的指针循环方法
{
sum += *p;
}
p = a + 4;//一定要重新进行赋值,不然可就惨咯w
for (int i = 4; i >= 0; i--)
cout << sum;//*p是降级的作用,牢记,甚至可以用于二维数组
return 0;
}