没VIP只能自己试一试数据,不保证能过。
基础练习 2n皇后问题
时间限制:1.0s 内存限制:512.0MB
问题描述
给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式
输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
输出格式
输出一个整数,表示总共有多少种放法。
样例输入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
2
样例输入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
0
回溯法,先放黑子再放白子。
做了快一个小时,都快比赛了,凉了啊。。。
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
#define INF 100000000
typedef pair P;
#define N 9
const int mod = 10007;
int n;
bool maps[N][N];
int black[N], white[N];
int ans;
bool isok(int x, int m)
{
if(m == 1){
for(int i = 1; i < x; i++){
if(abs(x - i) == abs(black[x] - black[i]) || black[x] == black[i])
return false;
}
}else{
for(int i = n; i > x; i--){
if(abs(x - i) == abs(white[x] - white[i]) || white[x] == white[i])
return false;
}
}
return true;
}
void dfs(int deep, int dir)
{
//cout << deep << ' ' << dir << endl;
if(deep == n + 1){
dfs(n, -1);
return;
}
if(deep == 0){
ans++;
//cout << "white ans " << white[1] << endl;
return;
}
for(int i = 1; i <= n; i++){
if(dir == 1)
black[deep] = i;//cout << "black " << deep << ' ' << i << '\n';
else{
if(black[deep] == i)
continue;
else{
white[deep] = i;//cout << "white " << deep << ' ' << i << '\n';
}
}
if(maps[deep][i] && isok(deep, dir)){
maps[deep][i] = false;
dfs(deep + dir, dir);
maps[deep][i] = true;
}
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> maps[i][j];
dfs(1, 1);
cout << ans << endl;
return 0;
}
FJ字符串
数据挺水才能过吧。递归输出应该能快好多,懒得敲。
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
#define INF 100000000
typedef pair P;
#define N 27
const int mod = 10007;
string s[27];
string alpha[30] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
int main()
{
s[0].clear();
int n;
cin >> n;
for(int i = 1; i <= n; i++){
s[i] = s[i - 1] + alpha[i - 1] + s[i - 1];
}
cout << s[n] << endl;
return 0;
}
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
#define INF 100000000
typedef pair P;
#define N 27
const int mod = 10007;
priority_queue, greater > que;
int main()
{
int n, m, a, b, ans;
cin >> n;
while(n--)
{
cin >> m;
que.push(m);
}
ans = 0;
while(que.size() > 1)
{
a = que.top();que.pop();
b = que.top();que.pop();
que.push(a + b);
ans += a + b;
//cout << ans << endl;
}
cout << ans;
return 0;
}
Sine之舞。找规律递归写。
/**
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
#define INF 100000000
typedef pair P;
#define N 202
const int mod = 10007;
string Sin = "sin(";
string num[10] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
int g;
string A(int n, int g)
{
if(n == g)
return Sin + num[n] + ")";
if(n & 1)
return Sin + num[n] + "-" + A(n + 1, g) + ")";
return Sin + num[n] + "+" + A(n + 1, g) + ")";
}
string S(int n)
{
if(n == g)
return A(1, g - n + 1) + "+" + num[n];
if(n > g)
return "";
return "(" + S(n + 1) + ")" + A(1, g - n + 1) + "+" + num[n];
}
int main()
{
cin >> g;
cout << S(1) << endl;
return 0;
}
*/
/**
#include
#include
#include
#include
using namespace std;
void An(int n)
{
int i;
for(i = 1; i <= n; i++)
{
printf("sin(%d", i);
if(i % 2 != 0 && i != n)
printf("-");
if(i % 2 ==0 && i != n)
printf("+");
}
for(i = 0; i < n; i++)
printf(")");
}
void Sn(int n)
{
int i, d;
d = n;
for(i = 0; i < n-1; i++)
printf("(");
for(i = 1; i <= n; i++)
{
An(i);
printf("+%d", d);
if(d != 1)
printf(")");
d--;
}
}
int main()
{
//freopen("1111.txt", "w", stdout);
int n;
scanf("%d", &n);
// An(n);
// printf("\n");
Sn(n);
return 0;
}
*/
#include
using namespace std;
void an(int n){
int i;
for(i=1;i<=n;i++){
cout<<"sin("<>n;
sn(n);
return 0;
}
报时助手。
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
#define INF 100000000
typedef pair P;
#define N 9
const int mod = 10007;
string num[21] = {"zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten",
"eleven", "twelve", "thirteen", "fourteen", "fifteen",
"sixteen", "seventeen", "eighteen", "nineteen", "twenty"};
string d[6] = {"", "", "twenty", "thirty", "forty", "fifty"};
int main()
{
int n, m;
while(cin >> n >> m)
{
if(m == 0){
cout << num[n] << " o'clock" < 20 && n % 10){
cout << d[n / 10] << ' ' << num[n % 10] << ' ';
}else
cout << num[n] << ' ';
if(m > 20 && m % 10)
cout << d[m / 10] << ' ' << num[m % 10] << endl;
else if(m > 20)
cout << d[m / 10] << endl;
else
cout << num[m] << endl;
}
}
分解质因数。
这题我把前面的存起来,后来的数字就可以用它的因子的分解了。
if(i > j)
for(int k = 0; k < ans[j].size(); k++)
ans[i].push_back(ans[j][k]);
这个if一开始没写,一般情况下j是i的因子,肯定比i小,但是相等的情况。。。。。。
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
#define INF 100000000
typedef pair P;
#define N 10001
const int mod = 10007;
vector ans[N];
bool prime[N];
void makeprime(int n)
{
prime[2] = true;
for(int i = 3; i <= n; i++)
prime[i] = i & 1?true:false;
for(int i = 2; i <= n; i++){
if(prime[i]){
ans[i].push_back(i);
for(int j = i + i; j <= n; j += i)
prime[j] = false;
}
}
}
int main()
{
int n, m, now, fac, si;
scanf("%d%d", &n, &m);
makeprime(m);
for(int i = n; i <= m; i++){
now = i;
for(int j = 2; j <= i; j++){
// printf("%d\n", now);
while(now >= j && now % j == 0){
if(i > j)
for(int k = 0; k < ans[j].size(); k++)
ans[i].push_back(ans[j][k]);
now = now / j;
// printf("now %d\n", now);
}
if(now == 1)
break;
}
}
for(int i = n; i <= m; i++){
si = ans[i].size();
printf("%d=", i);
for(int j = 0; j < si; j++)
printf("%d%c", ans[i][j], j == si - 1?'\n':'*');
}
return 0;
}
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
#define INF 100000000
typedef pair P;
#define N 103
const int mod = 10007;
void highadd(string &a, string &b, string &c)
{
int la = a.length(), lb = b.length();
int ans[N] = {0}, n[N] = {0}, m[N] = {0};
int k = 0;
for(int i = 0; i < la; i++)
n[i] = a[la - i - 1] - '0';
for(int i = 0; i < lb; i++)
m[i] = b[lb - i - 1] - '0';
k = max(la, lb);
for(int i = 0; i < k; i++){
if(i < la)
ans[i] += n[i];
if(i < lb)
ans[i] += m[i];
}
int x = 0;
for(int i = 0; i < k; i++){
ans[i] += x;
x = ans[i] / 10;
ans[i] %= 10;
}
if(x){
ans[k] = x;
k++;
}
while(ans[k - 1] == 0)
k--;
c.clear();
for(int i = k - 1; i >= 0; i--)
c += char(ans[i] + '0');
}
int main()
{
string a, b, c;
while(cin >> a >> b)
{
highadd(a, b, c);
cout << c << endl;
}
return 0;
}
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
#define INF 100000000
typedef pair P;
#define N 103
const int mod = 10007;
int main()
{
//freopen("input10.txt", "r", stdin);
int v1, v2, t, s, l;
int r, d, T;
cin >> v1 >> v2 >> t >> s >> l;
if(v2 > v1){
printf("T\n%d\n", l / v2);
return 0;
}
r = d = T = 0;
while(r < l && d < l)
{
if(r - d >= t){
int tmp = s;
while(tmp-- && d < l){
d += v2;
T++;
}
if(tmp && d == l){
printf("T\n%d\n", T);
return 0;
}
}else{
d += v2;
r += v1;
T++;
}
}
if(r == l && d == l)
printf("D\n%d\n", T);
else if(r < l)
printf("T\n%d\n", T);
else
printf("R\n%d\n", T);
return 0;
}
回形取数。
一开始存一下方向向量。
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
#define INF 100000000
typedef pair P;
#define N 202
const int mod = 10007;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
bool used[N][N];
int num[N][N];
int main()
{
//freopen("input10.txt", "r", stdin);
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
cin >> num[i][j];
for(int i = 0; i <= m + 1; i++)
used[0][i] = used[n + 1][i] = true;
for(int j = 0; j <= n + 1; j++)
used[j][0] = used[j][m + 1] = true;
int x = 0, y = 1, all = n * m;
int ans[N * N] = {0}, k = 0;
for(int i = 0; all; i++){
i %= 4;
while(!used[x + dx[i]][y + dy[i]]){
x += dx[i];y += dy[i];
ans[k++] = num[x][y];
used[x][y] = true;
all--;
}
}
for(int i = 0; i < k; i++)
printf("%d%c", ans[i], i == k - 1?'\n':' ');
return 0;
}
阶乘计算。我用高精度乘法写的。
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
#define INF 100000000
typedef pair P;
#define N 3000
const int mod = 10007;
int main()
{
//freopen("input10.txt", "r", stdin);
int n, ans[N] = {0}, k = 0, num[5], l = 0, las[N] = {0};
scanf("%d", &n);
ans[k++] = 1;
for(int i = 1; i <= n; i++){
int tmp = i;
l = 0;
while(tmp){
num[l++] = tmp % 10;tmp /= 10;
}
for(int q = 0; q < k; q++){
las[q] = ans[q];
ans[q] = 0;
}
for(int j = 0; j < k; j++)
for(int m = 0; m < l; m++)
ans[j + m] += las[j] * num[m];
int x = 0;
for(int i = 0; i < k + l + 3; i++){
ans[i] += x;
x = ans[i] / 10;
ans[i] %= 10;
}
k = k + l + 3;
while(!ans[k - 1])
k--;
}
for(int o = k - 1; o >= 0; o--)
printf("%d", ans[o]);
return 0;
}
基础练习 芯片测试
时间限制:1.0s 内存限制:512.0MB
问题描述
有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。
每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
给出所有芯片的测试结果,问哪些芯片是好芯片。
输入格式
输入数据第一行为一个整数n,表示芯片个数。
第二行到第n+1行为n*n的一张表,每行n个数据。表中的每个数据为0或1,在这n行中的第i行第j列(1≤i, j≤n)的数据表示用第i块芯片测试第j块芯片时得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果。芯片不能对本 身进行测试)。
输出格式
按从小到大的顺序输出所有好芯片的编号
样例输入
3
1 0 1
0 1 0
1 0 1
样例输出
1 3
深搜所有可能性,对每个可能性进行答案匹配。
真尼玛暴力。
可惜没vip不知道超不超时。用codeblocks试了几组数据没超时。
#include
using namespace std;
typedef long long ll;
const double eps = 1e-8;
#define INF 100000000
typedef pair P;
#define N 21
const int mod = 10007;
int n;
int ans[N], l = 0;
bool chip[N], used[N];
bool maze[N][N];
bool flag;
bool judge()
{
for(int i = 0; i < n; i++){
if(chip[i])
for(int j = 0; j < n; j++){
if(i == j)
continue;
if(maze[i][j] != chip[j])
return false;
}
}
return true;
}
void dfs(int deep)
{
if(flag)
return;
if(deep == n){
// for(int i = 0; i < n; i++)
// printf("%d%c", chip[i], i == n - 1?'\n':' ');
if(judge()){
for(int i = 0; i < n; i++)
if(chip[i])
ans[l++] = i + 1;
for(int i = 0; i < l; i++)
printf("%d%c", ans[i], i == l - 1?'\n':' ');
flag = true;
return;
}
}
for(int i = 0; i < n; i++){
if(!used[i]){
used[i] = true;
chip[i] = true;
dfs(deep + 1);
chip[i] = false;
dfs(deep + 1);
used[i] = false;
}
}
}
int main()
{
// freopen("input5.txt", "r", stdin);
scanf("%d", &n);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d", &maze[i][j]);
dfs(0);
return 0;
}