110.字符串接龙
- 本题是一个无向图,需要用标记位,标记着节点是否走过,否则就会死循环!
- 使用set来检查字符串是否出现在字符串集合里更快一些
- map是用来存放路径的长短的。
#include<iostream>
#include<queue>
#include<unordered_set>
#include<unordered_map>
#include<string>
using namespace std;
int main(){
int n;
string beginStr,endStr,str;
cin>>n;
cin>>beginStr>>endStr;
unordered_set<string> set;
for(int i=0;i<n;i++){
cin>>str;
set.insert(str);
}
unordered_map<string,int> map;
map.insert(pair<string ,int>(beginStr,1));
queue<string> que;
que.push(beginStr);
while(!que.empty()){
string str=que.front();
que.pop();
int path = map[str];
for(int i=0;i<str.size();i++){
string str_new=str;
for(int j=0;j<26;j++){
str_new[i]=j + 'a';
if(str_new == endStr){
cout<< path + 1 << endl;
return 0;
}
if(set.find(str_new)!=set.end() && map.find(str_new) == map.end()){
map.insert(pair<string ,int>(str_new,1+path));
que.push(str_new);
}
}
}
}
cout << 0 << endl;
}
105.有向图的完全可达性
有向图,用邻接表来做,这题直接用广搜就为最后的答案。(注意有向图的遍历和写入)
用一个数组来存放节点是否能到达。
#include<iostream>
#include<vector>
#include<list>
using namespace std;
void dfs(const vector<list<int>> &graph,vector<bool> &vis,int key){
if(vis[key]) return;
vis[key]=true;
list<int> keys=graph[key];
for(int key : keys){
dfs(graph,vis,key);
}
}
int main(){
int N,K,s,t;
cin>>N>>K;
vector<list<int>> graph(N+1);
for(int i=0;i<K;i++){
cin>>s>>t;
graph[s].push_back(t);
}
vector<bool> vis(N+1,false);
dfs(graph,vis,1);
for(int i=1;i<N+1;i++){
if(vis[i]==false){
cout<<-1<<endl;
return 0;
}
}
cout<<1<<endl;
return 0;
}
106.岛屿的周长
主要是理解什么时候对周长加一,也就是该点为岛屿,并且上下左右其中一个为边界或者为水的时候。四个方向都要判断。
#include<iostream>
#include<vector>
using namespace std;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int main(){
int N,M;
cin>>N>>M;
vector<vector<int>> graph(N ,vector<int>(M,0));
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
cin>>graph[i][j];
}
}
int res=0;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
if(graph[i][j]==1){
for(int k=0;k<4;k++){
int next_x = i + dir[k][0];
int next_y = j + dir[k][1];
if(next_x>=N||next_y>=M||next_x<0||next_y<0||graph[next_x][next_y]==0) res++;
}
}
}
}
cout<<res<<endl;
return 0;
}