- 2023tyoi0292 的博客
冬令营的平方数
- 2024-1-25 14:31:33 @
冬令营的平方数
思路:用for循环试一遍每个数量,然后dfs
,每次标记一个数位,标记完后计算,如果是计算,如果是平方数就返回true
,并输出。
代码:
#include <iostream>
#include <cmath>
#define int long long
using namespace std;
string num;
bool flag;
void dfs(string s, int cur, int mb) {
if(cur == mb) {
int x = 0;
for(int i = 0; i < s.size(); i++) {
if(s[i] != 'a') x = x * 10 + (s[i] - '0');
}
if(x != 0LL && abs(sqrt(x) - (int)sqrt(x)) <= 1e-11) flag = true;
return;
}
if(flag) return;
for(int i = 0; i < s.size(); i++) {
if(s[i] != 'a') {
char tmp = s[i];
s[i] = 'a';
dfs(s, cur + 1, mb);
s[i] = tmp;
}
}
}
bool check(int x) {
flag = false;
dfs(num, 0, x);
return flag;
}
signed main() {
cin >> num;
for(int i = 0; i < num.size(); i++) {
if(check(i)) {
cout << i << endl;
return 0;
}
}
cout << -1 << endl;
return 0;
}
然后这个代码获得了85分的好成绩。
我就是这么逝掉的
易错点:要判断前导0!!!
真正的AC代码要加上这一段:
if(x != 0) {
for(int i = 0; i < s.size(); i++) {
if(s[i] != 'a') {
if(s[i] == '0') return;
else break;
}
}
}
AC代码:
#include <iostream>
#include <cmath>
#define int long long
using namespace std;
string num;
bool flag;
void dfs(string s, int cur, int mb) {
if(cur == mb) {
int x = 0;
for(int i = 0; i < s.size(); i++) {
if(s[i] != 'a') x = x * 10 + (s[i] - '0');
}
if(x != 0) {
for(int i = 0; i < s.size(); i++) {
if(s[i] != 'a') {
if(s[i] == '0') return;
else break;
}
}
}
if(x != 0LL && abs(sqrt(x) - (int)sqrt(x)) <= 1e-11) flag = true;
return;
}
if(flag) return;
for(int i = 0; i < s.size(); i++) {
if(s[i] != 'a') {
char tmp = s[i];
s[i] = 'a';
dfs(s, cur + 1, mb);
s[i] = tmp;
}
}
}
bool check(int x) {
flag = false;
dfs(num, 0, x);
return flag;
}
signed main() {
cin >> num;
for(int i = 0; i < num.size(); i++) {
if(check(i)) {
cout << i << endl;
return 0;
}
}
cout << -1 << endl;
return 0;
}
点个赞吧