第一关
本关任务:进制转化
说白了就是转化计算的过程符合“后进先出”的特点
#include <bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
typedef struct Stack
{
int *top;
int *base;
int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{
s.base = new int[MAXSIZE];
s.top = s.base;
s.stacksize = MAXSIZE;
return OK;
}
bool StackEmpty(SqStack s)
{
return s.top == s.base;
}
Status Push(SqStack &s,int e)
{
if (s.top - s.base == s.stacksize)
return ERROR;
*s.top++ = e;
return OK;
}
Status Pop(SqStack &s,int &e)
{
if (s.top == s.base)
return ERROR;
e = *--s.top;
return OK;
}
void conversion(int n,int m)
{
int e;
SqStack S;
InitStack(S);
do
{
Push(S, n % m);
n = n / m;
} while (n != 0);
while(!StackEmpty(S))
{
Pop(S,e);
cout << e;
}
}
int main()
{
int n,m;
cin >> n >> m;
conversion(n,m);
return OK;
}
续更递归转化进制
本关任务:递归进制转化
首先要知道递归的思路是不断将 n
除以 m
,直到 n
变为 0,每次除法的余数即为转换后的数位,所以输出一定是在递归调用之后
#include <bits/stdc++.h>
using namespace std;
void ConversionRecur(int n,int m)
{
if (n == 0) {
return;
}
ConversionRecur(n / m, m);
int cnt = n % m;
if (cnt < 10) {
cout << cnt;
} else {
cout << (char)('A' + cnt - 10);
}
}
int main()
{
int n,m;
cin >> n >> m;
ConversionRecur(n,m);
return 0;
}
续更递归解决n皇后问题
本关任务:递归解决n皇后
n皇后要求任意两个皇后都不在同一行、同一列或同一条对角线上,那么解法便出来了:
只需要递归行数,遍历当前行数的每一列,判断是否可以放置皇后,当前位置可以的话就递归到下一行,不可以的话就继续判断当前行的下一个位置
判断时候需要判断三个方向,当前行肯定是未放置所以不需要判断(一旦放置就去下一行了),所以需判断两个对角线方向和当前列是否存在其他皇后
需要注意的问题就是递归之后需要恢复现场
#include <bits/stdc++.h>
using namespace std;
int n;
int sum = 0;
bool check(vector<vector<int>>& board, int row, int col, int n) {
// 检查同一列
for (int i = 0; i < row; i++) {
if (board[i][col] == 1) {
return false;
}
}
// 检查左上方对角线
for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == 1) {
return false;
}
}
// 检查右上方对角线
for (int i = row, j = col; i >= 0 && j < n; i--, j++) {
if (board[i][j] == 1) {
return false;
}
}
return true;
}
void nqueens(vector<vector<int>>& board, int row, int n, int& sum) {
if (row == n) {
sum++;
return;
}
for (int col = 0; col < n; col++) {
if (check(board, row, col, n)) {
// 放置皇后
board[row][col] = 1;
// 递归处理下一行
nqueens(board, row + 1, n, sum);
// 回溯
board[row][col] = 0;
}
}
}
int main()
{
cin >> n;
//初始化棋盘
vector<vector<int>> board(n, vector<int>(n, 0));
//递归
nqueens(board, 0, n, sum);
cout << sum << endl;
return 0;
}