第 1 题:受伤的皇后
题目描述
有一个n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n 个受伤的国际象棋皇后,要求:
任何两个皇后不在同一行。
任何两个皇后不在同一列。
如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。
请问一共有多少种摆放方案。
#include <iostream>
using namespace std;
int a[10]; //用来存储第i行存储在第几列
int count,n;
bool valid(int row,int y) { //判断row行的y列是否可用
for(int i=1; i<row; i++) {
if(a[i]==y) return false;
if((a[i]+i==row+y)&&(row-i)<3) return false;
if((row-i==y-a[i])&&(row-i)<3) return false;
}
return true;
}
void dfs(int row) {
if(row==n+1) {
count++;
return;
}
for(int i=1; i<=n; i++) {
if(valid(row,i)) {
a[row]=i;//row行存在第i列
dfs(row+1);
a[row]=0;
}
}
}
int main() {
cin>>n;
dfs(1);
cout<<count;
}
第 2 题:完全平方数
一个整数 a 是一个完全平方数, 是指它是某一个整数的平方, 即存在一个 整数 b, 使得 a=b^2 。
给定一个正整数 n, 请找到最小的正整数 x, 使得它们的乘积是一个完全平 方数。
思路:直接分解n,将成对出现的因子抵消,剩下无法抵消的相乘就是答案
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n;
cin >> n;
for (ll i = 2; i * i <= n; ++i) {
ll t = i * i;
while (n % t == 0) {
n /= t;
}
}
cout << n << endl;
}