2022-01-22每日刷题打卡
一本通
1213:八皇后问题
【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
No. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
No. 2
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
...以下省略
。。。做不到按顺序输出,我run了。
#include<iostream>
using namespace std;
const int N = 100;
int n = 8, idx = 1;;
int queen[N][N];
bool col[N], dg[N], udg[N];
void dfs(int u)
{
if (u == n)
{
cout << "No. " << idx++ << endl;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << queen[i][j] << " ";
}
cout << endl;
}
return;
}
for (int i = 0; i < n; i++)
{
if (!col[i] && !dg[u + i] && !udg[n - u + i])
{
col[i] = dg[u + i] = udg[n - u + i] = true;
queen[u][i] = 1;
dfs(u + 1);
col[i] = dg[u + i] = udg[n - u + i] = false;
queen[u][i] = 0;
}
}
}
int main()
{
dfs(0);
return 0;
}
1329:【例8.2】细胞
【题目描述】
一矩形阵列由数字00到99组成,数字11到99代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:
阵列
4 10
0234500067
1034560500
2045600671
0000000089
有44个细胞。
【输入】
第一行为矩阵的行nn和列mm;下面为一个n×mn×m的矩阵。
【输出】
细胞个数。
【输入样例】
4 10
0234500067
1034560500
2045600671
0000000089
【输出样例】
4
广度遍历搜索,待把迷宫记录下来后,遍历,当遍历到的点不为0时,以这个点作为起点,进行广度搜索,把起点连着的所有点都设置为0,一切结束后,细胞数++。当遍历完所有起点后,输出细胞数。
#include<iostream>
using namespace std;
typedef pair<int, int>PII;
const int N = 410;
int g[N][N];
int h[N][N];
PII que[N * N];
int n, m;
int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,1,0,-1 };
void bfs(int x, int y)
{
que[0] = { x,y };
int hh = 0, tt = 0;
while (hh <= tt)
{
auto t = que[hh++];
for (int i = 0; i < 4; i++)
{
int a = t.first + dx[i], b = t.second + dy[i];
if (a >= 0 && a < n && b >= 0 && b < m && g[a][b] != 0)
{
g[a][b] = 0;
que[++tt] = { a,b };
}
}
}
}
int main()
{
memset(g, 0, sizeof(g));
cin >> n >> m;
int ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
scanf("%1d", &g[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if (g[i][j] != 0)
{
bfs(i, j);
ans++;
}
cout << ans << endl;
return 0;
}
蓝桥杯
算法提高 三个整数的排序
问题描述
输入三个数,比较其大小,并从大到小输出。
输入格式
一行三个整数。
输出格式
一行三个整数,从大到小排序。
样例输入
33 88 77
样例输出
88 77 33
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
int main()
{
vector<int>v(3);
for (int i = 0; i < 3; i++)
cin >> v[i];
sort(v.begin(), v.end());
for (int i = 2; i >= 0; i--)
cout << v[i] << " ";
return 0;
}