一个C语言题目?
递归,传入参数为未答题同学数k和当前总得分sum每次一位同学答题后k--,码解然后有四种选择使总分发生变化,码解即沿四个分支继续递归
递归终止条件为k==0,码解此时再判断sum是码解否为0即可
C语言代码和运行结果如下:
输出为,数学验证一下,码解总分为0只可能为:4个同学都选甲题,码解2对2错;
4个同学都选乙题,码解怎么解压源码2对2错;2个同学选甲题,码解1对1错,码解另2个同学选乙题,码解1对1错
因此答案为:A(4,码解2)+A(4,2)+A(4,2)=,结果正确,coco免费源码望采纳~
附源码:
#include <stdio.h>
int ans = 0;
void dfs(int k, int sum) {
if (k == 0) { // 所有人都答题完毕
if (sum == 0)
ans++;
return;
}
dfs(k - 1, sum + ); // 选择甲题且答对
dfs(k - 1, sum - ); // 选择甲题且答错
dfs(k - 1, sum + ); // 选择乙题且答对
dfs(k - 1, sum - ); // 选择乙题且答错
}
int main() {
dfs(4, 0); // 一共4人,初始得分为0
printf("%d\n", ans);
return 0;
}
八皇后问题 DFS 结束条件是什么
放皇后q[i]=j,同时让第j列和过(i,j)位置的两条对角线变为不安全,即让C[j]=false,L[i-j+8]=false,R[i+j]=false。
查一下i是农业erp源码否为8,如果为8,则表明已经放完8个皇后,方案数Num加1,输出该方案下8个皇后的位置;否则,未到8个,美食地图源码则皇后数i加1再试着放,递归调用 Try(i+1)。
为了寻找不同方案,当一个方案输出后,要回溯,将先前放的皇后从棋盘上拿起来,看看能否再换一处位置。这时要将被拿起来的皇后的所在位置的第j列和两条对角线恢复为安全的
void Try( int i )
{
for ( int j = 1; j <= n; j++ )
{
if ( 第 i 行第 j 列没有攻击 )
{
在第 i 行第 j 列安放皇后;
if ( i == n ) 输出一个布局;
else Try ( i+1 );
撤消第 i 行第 j 列的皇后;
}
}
}
c++队列的问题,学习图时在成员函数使用了pop(),但是无效,请问是什么原因?
问题在于你的queue<int> adj(int v) 函数返回的是一个queue的拷贝,而不是queue本身。
改成
queue <int>& adj(int v) //获取和顶点v相邻的所有顶点
{
return adjacent[v];
}
全部源码如下:
#include<iostream>
#include<queue>
using namespace std;
class Graph {
public:
Graph(int v) //创建一个包含v个顶点但不包含边的图
{
this -> adjacent = new queue < int > [v];
this -> V = v;
this -> E = 0;
}
int Vnum() //获取顶点的数量
{
return this -> V;
}
int Enum() //获取边的数量
{
return this -> E;
}
void addEdge(int v, int w)
//向图中增加一条边 v-w
{
this -> adjacent[v].push(w);
this -> adjacent[w].push(v);
this -> E++;
}
queue <int>& adj(int v) //获取和顶点v相邻的所有顶点
{
return adjacent[v];
}
private:
int V; //顶点数量
int E; //顶点边数量
queue < int > * adjacent;
};
class DepthFirstSearch {
public:
DepthFirstSearch(Graph G, int s) { //构件深度优先搜索对象,利用深度优先搜索找出G图中s顶点的所有相同顶点
this -> marked = new bool[G.Vnum()];
for (int i = 0; i < G.Vnum();
++i) {
marked[i] = false;
}
this -> N = 0;
dfs(G, s);
}
void dfs(Graph G, int v) //利用深度优先搜索找出G中v顶点的所有相通顶点
{
marked[v] = true;
int w = G.adj(v).front();
while (!G.adj(v).empty()) //找到v队列里的内容
{
if (!marked[w]) {
dfs(G, w);
}
cout << "队列大小:" << G.adj(v).size() << endl;
G.adj(v).pop();
cout << "队列删除后的大小:" << G.adj(v).size() << endl;
if (G.adj(v).empty() == 1) {
break;
}
w = G.adj(v).front();
}
this -> N++;
//N加1 的位置放在当前节点变true的时候
}
bool mark(int w) //判断w与s是否相通
{
return marked[w];
}
int count() {
return N;
}
private: bool * marked; //索引代表顶点,值表示当前顶点是否已经被搜索
int N; //记录有多少个顶点与s顶点相同
};
int main() {
Graph g();
g.addEdge(0, 6);
g.addEdge(0, 2);
g.addEdge(0, 1);
g.addEdge(0, 6);
g.addEdge(5, 3);
g.addEdge(5, 4);
g.addEdge(3, 4);
g.addEdge(4, 6);
g.addEdge(7, 8);
g.addEdge(9, );
g.addEdge(9, );
g.addEdge(, );
g.addEdge(9, );
DepthFirstSearch * DFS = new DepthFirstSearch(g, 0);
int num = DFS -> count();
cout << num << endl;
return 0;
}
2024-12-23 06:22
2024-12-23 06:08
2024-12-23 04:48
2024-12-23 04:38
2024-12-23 04:17