做了三届的题目,发现蓝桥杯的结果填空题解法莫过于枚举和dfs。(偶尔也会来点找规律、递归、dp)
#include <iostream>
#include <stdlib.h> //atoi
#include <stdio.h> //sprintf
#include <string.h> //memcpy
using namespace std;
int sum = 0;
char num[4] = {0};
bool vis[10] = {false};
void dfs(int step){ //step表示当前考虑第几位数
if(step == 4){
for(int i= 1; i<=2;i++){ //i乘号的位置,满足乘法交换律的算一种情况,所以是1-2,否则1-4
char temp = num[i];
num[i] = '\0';
int a = atoi(num);
num[i] = temp;
int b = atoi(num + i);
int ji = a * b;
if(a > b) continue; //只取a<=b的情况
if(ji>9999) continue; //只能4位数
char cJi[5];
sprintf(cJi,"%d",ji);
int j = 0;
bool vis_bak[10];
memcpy(vis_bak, vis, sizeof(vis));
for(; j < 4; j++){
if(!vis_bak[cJi[j] - '0'])
break;
else
vis_bak[cJi[j] - '0'] = 0;
}
if(j == 4){
cout << a << " " << b << " " << ji << endl;
sum++;
}
}
return;
}
for(int i = 0; i <= 9; i++){
if(step == 0 && i == 0) continue;
if(vis[i]) continue;
vis[i] = 1;
num[step] = '0' + i;
dfs(step + 1);
vis[i] = 0;
}
}
int main(int argc, char *argv[]) {
dfs(0);
cout << sum;
return 0;
}