蓝桥杯基础练习

没VIP只能自己试一试数据,不保证能过。


基础练习 2n皇后问题 

时间限制:1.0s  内存限制:512.0MB

   

问题描述

  给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8

输入格式

  输入的第一行为一个整数n,表示棋盘的大小。
  接下来n行,每行n01的整数,如果一个整数为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;
}


Huffuman树。优先队列直接杠。
#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

   

问题描述

  有n2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。
  每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
  给出所有芯片的测试结果,问哪些芯片是好芯片。

输入格式

  输入数据第一行为一个整数n,表示芯片个数。
  第二行到第n+1行为n*n的一张表,每行n个数据。表中的每个数据为01,在这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;
}



 

你可能感兴趣的:(蓝桥杯,深搜回溯)