全排列+n皇后问题(C++深度优先搜索与广度优先搜索)

3 全排列

从键盘输入一个没有重复元素的字符串,输出这个字符串所有字符的全排列

输入格式:

一个字符串,输入保证字符串中没有重复的字符,字符串的长度不超过10,字符串中不含空格。

输出格式:

按字典序输出该字符串所有字符的全排列。每个字符之间没有空格。每种排列之间换行。

输入样例1:

ABC

输出样例1:

ABC
ACB
BAC
BCA
CAB
CBA

输入样例2:

CAB

输出样例2:

ABC
ACB
BAC
BCA
CAB
CBA

输入样例3:

ATOM

输出样例3:

AMOT
AMTO
AOMT
AOTM
ATMO
ATOM
MAOT
MATO
MOAT
MOTA
MTAO
MTOA
OAMT
OATM
OMAT
OMTA
OTAM
OTMA
TAMO
TAOM
TMAO
TMOA
TOAM
TOMA

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<iostream>
#include <memory.h>
#include <string>
#include <algorithm>

using namespace std;
bool visited[12] = {false};
string s;
int num = 0;
char mark[12];


void dfs(int n);

int main()
{

    cin >> s;
    for(int i = 0; i < s.size()-1; i++)
        for(int j = i+1; j < s.size(); j++)
            if(s[i] > s[j])
            {
                char m = s[i];
                s[i] = s[j];
                s[j] = m;
            }
    bfs(0);

}

void dfs(int n)
{
    //输出字符串所有字符后换行返回
    if(num == s.size())
    {

        cout << mark << endl;

        return;
    }


    for(int i = 0; i < s.size(); i++)
    {


        //如果没访问过该字符、并且不是当前字符,就接着bfs该字符
        if(visited[i] == false)
        {
            visited[i] = true;  //设为访问过了
            mark[num++] = s[i]; //将该字符存入mark
            dfs(i);             //bfs该字符
            visited[i] = false; //调用完回溯回来,设为没访问过
            num--;              //访问过的字符长度-1
        }
    }
}

4 n皇后问题

要求在n*n格的棋盘上放置彼此不会相互攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

输入格式:

测试数据有多组,处理到文件尾。对于每组测试,输入棋盘的大小n(1<n<12)。

输出格式:

对于每组测试,输出满足要求的方案个数。

输入样例:

4

输出样例:

2

代码长度限制

16 KB

Python (python3)

时间限制

4000 ms

内存限制

64 MB

其他编译器

时间限制

400 ms

内存限制

64 MB

#include<iostream>
#include <memory.h>
#include <string>
#include <algorithm>
#include <stdio.h>

using namespace std;
void HanShu(int x, int y);
int mark = 0;
int n;
int point[12][12] = {0};
int row = 0; //到第几行该放棋子了

int main()
{

    while(cin >> n)
    {
        mark = 0; row = 0;
        memset(point, 0, sizeof(point));

        //从第0行开始判断
        HanShu(0, 0);
        cout << mark << endl;

    }
return 0;
}

void HanShu(int x, int y)
{
    //判断到第n行结束
    if(x == n)
    {
        mark++;
        return;
    }


    for(int s = 0; s < n; s++)
    {
        int m = 0; //标记是否有冲突棋子
        y = s;
        //把当前坐标放上棋子
        point[x][y] = 1;
        //cout<<"我放置了棋子在"<<'(' << x << ' ' << y <<')'<<endl;
        //当与他一行或一列或斜线有1时,停止循环
        for(int i = 0; i < x; i++)
        {
            if(point[i][y] == 1)
            {
                //cout<<'(' << x << ' ' << y <<')'<<"同列有棋子"<<'(' << i << ' ' << y <<')'<<endl;
                point[x][y] = 0;
                m = 1;
                break;
            }

        }
        for(int i = 0; i < y; i++)
        {

            if(point[x][i] == 1)
            {
                //cout<<'(' << x << ' ' << y <<')' << "同行有棋子"<<'(' << x << ' ' << i <<')'<<endl;
                point[x][y] = 0;
                m = 1;
                break;
            }
        }
        //判断左上斜线的1
        int x2 = x-1, y2 = y-1;
        while(x2 >= 0 && y2 >= 0)
        {

            if(point[x2][y2] == 1)
            {
                //cout<<'(' << x << ' ' << y <<')'<<"左上斜线有棋子"<<'(' << x2 << ' ' << y2 <<')'<<endl;
                point[x][y] = 0;
                m = 1;
                break;
            }
            x2--;
            y2--;
        }
        //判断右上斜线的1
        x2 = x-1;
        y2 = y+1;
        while(x2 >= 0 && y2 < n)
        {

            if(point[x2][y2] == 1)
            {
                //cout<<'(' << x << ' ' << y <<')'<<"右上斜线有棋子"<<'(' << x2 << ' ' << y2 <<')'<<endl;
                point[x][y] = 0;
                m = 1;
                break;
            }
            x2--;
            y2++;
        }
        if(m == 1) continue;
        //到这说明该位置可以放棋子,继续往下调用,换到下一行
        //cout<<'(' << x << ' ' << y <<')'<<"没有冲突的棋子,我接下来放" <<'(' << x+1 << ' ' << 0 <<')'<<endl;
        HanShu(x+1, 0);
        //回溯后棋子拿下
        point[x][y] = 0;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_63484669/article/details/127600703