编程第二题
赋值符号写成等号害一生!
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<unordered_map>
using namespace std;
unordered_map<int, bool> mp;
int G[6][6]={{1,2,3,4,5},{11,12,13,14,15},{21,22,23,24,25},
{31,32,33,34,35},{41,42,43,44,45}};
int dx[4] = {1, -1, 0, 0}, dy[4]={0, 0, 1, -1};
int tag;
vector<int> vx, tmp;
void dfs(int u, int v, int k){
if(tag == true) return;
if(k == 6){
int cnt = 0;
for(auto x: tmp) if(mp[x]){
cnt++;
}
if(cnt == 6){
tag = true;
}
return;
}
int t = G[u][v];
G[u][v] = 100; //标记避免重复访问 这个赋值符号写成了等号 草泥马 我再犯这种错误我是狗
tmp[k] = t;
for(int i = 0; i < 4; i++){ //搜索四个方向
int a = u + dx[i], b = v + dy[i];
if(a >= 0 && b >= 0 && a < 5 && b < 5 && G[a][b] != 100){
dfs(a, b, k + 1);
}
}
G[u][v] = t; //回溯 这里也犯了同样的错误
}
int main(){
int x;
string str;
tmp.resize(6);
char c;
while(cin >> x){
c = getchar();
mp[x] = true;
if(c == '\n'){
bool flag = true;
for(int i = 0; i < 5 && flag; i++){
for(int j = 0; j < 5; j++){
if(x==G[i][j]){
tag = false;
dfs(i, j, 0);
if(tag){
cout<<1<<endl;
flag = false;
break;
}
}
}
}
if(flag) cout<<0<<endl;
vx.clear();
mp.clear();
tmp.clear();
}
}
return 0;
}

本文通过一个具体的C++编程题目,深入探讨了深度优先搜索(DFS)与回溯算法的应用。代码中详细展示了如何使用DFS遍历二维数组,并通过标记避免重复访问,以及如何在递归调用结束后进行状态恢复的回溯操作。此外,还特别强调了正确使用赋值运算符的重要性,避免将赋值符号误写为等号的常见错误。

4945

被折叠的 条评论
为什么被折叠?



