summaryrefslogtreecommitdiff
path: root/429/word.cpp
diff options
context:
space:
mode:
Diffstat (limited to '429/word.cpp')
-rw-r--r--429/word.cpp72
1 files changed, 48 insertions, 24 deletions
diff --git a/429/word.cpp b/429/word.cpp
index 83c727f..6685b17 100644
--- a/429/word.cpp
+++ b/429/word.cpp
@@ -1,11 +1,13 @@
#include <iostream>
#include <vector>
#include <string>
+#include <queue>
+#include <sstream>
using namespace std;
int get_dist(string a, string b);
void make_graph(vector<string> wlist, int map[][200]);
-bool get_pathlen(int map[][200], vector<string> wlist, int start, int dest, string &path, bool visited[]);
+int bfs(int map[][200], int start, int dest, int s);
int main(){
int tc;
@@ -19,44 +21,66 @@ int main(){
wlist.push_back(w);
}
make_graph(wlist, map);
+ cin.ignore();
- string s1, s2;
- while(cin>>s1>>s2){
+ string line, s1, s2;
+ getline(cin, line);
+ while(line!=""){
int l1, l2;
+ istringstream iss(line);
+ iss>>s1>>s2;
+
for(int i=0; i<wlist.size(); i++){
if(wlist[i]==s1)
l1 = i;
else if(wlist[i]==s2)
l2 = i;
}
- int len = 0;
- bool visited[200];
- string path;
- get_pathlen(map, wlist, l1, l2, path, visited);
- cout<<s1<<" "<<s2<<" "<<path.length()-1<<endl;
+
+ cout<<s1<<" "<<s2<<" "<<bfs(map, l1, l2, wlist.size())<<"\n";
+ getline(cin, line);
}
}
}
-bool get_pathlen(int map[][200], vector<string> wlist, int start, int dest, string &path, bool visited[]){
- if(start==dest){
- path+="a";
- return true;
- }
- else{
- visited[start]=true;
- for(int j=0; j<26; j++){
- if(map[start][j]==1 && visited[j]==false){
- visited[j]=true;
- if(get_pathlen(map, wlist, j, dest, path, visited) == true){
- path+="a";
- return true;
- }
- }
+/*
+pred=[] pred list
+q=[] queue
+q.add(startnode)
+
+while !q.empty
+ node_A = dequeue q
+ for each unvisited node_B adj to node_A
+ pred[node_B]=node_A
+ q.add(node_B)
+ */
+
+int bfs(int map[][200], int start, int dest, int s){
+ queue<int> q;
+ int pred[200], n;
+ bool visited[200] = {false};
+
+ q.push(start);
+ while(!q.empty()){
+ n = q.front();
+ q.pop();
+ for(int i=0; i<s; i++){
+ if(visited[i]==false && map[n][i]==1){
+ q.push(i);
+ visited[i]=true;
+ pred[i]=n;
+ }
}
- return false;
}
+
+ int len = 0, k=dest;
+ while(k!=start){
+ k = pred[k];
+ len++;
+ }
+ return len;
}
+
void make_graph(vector<string> wlist, int map[][200]){
for(int i=0; i<wlist.size(); i++)
for(int j=0; j<wlist.size(); j++)