leetcode126

#include <iostream>
#include<stdlib.h>
#include<string>
#include<vector>
using namespace std;

vector<string> wordlist= { "hot","dot","dog","lot","log","cog" };
vector<vector<int>>v;//下标表示第i个单词,存储的是与单词相差一个字母的单词在wordlist中的下标
vector<bool> visited;
vector<vector<int>>ans;//要最短hhh
vector<int>path;
int min_trans = 999999;//最少的转变次数
string start="hit";
string endWord="cog";
//判断两个单词是不是只相差一个字母
bool OneCharDifferent(string left, string right) {
	int count = 0;
	for (int i = 0; i < left.length(); i++) {
		if (left[i] != right[i])
			count++;
		if (count > 1)
			return false;
	}
	return true;
}
//一些初始化操作
void init() {
	wordlist.push_back(start);//将 开始单词作为最后一个单词;process从最后开始
	visited.resize(wordlist.size());//一定要放在上面这句话的后面
	v.resize(wordlist.size());
	for (int i = 0; i < wordlist.size(); i++) {
		for (int j = i + 1; j < wordlist.size();j++)
			if (OneCharDifferent(wordlist[i], wordlist[j])) {
				v[i].push_back(j);
				v[j].push_back(i);
			}
	}
}
//打印结果
void print() {
	for (int i = 0; i < ans.size(); i++) {
		for (int j = 0; j < ans[i].size(); j++)
			cout << wordlist[ans[i][j]] << " ";
		cout << endl;
	}
}
//current表示当前单词的下标,wordNum表示已经记录的单词个数
void process(int current,int wordNum) {
	if (wordNum > min_trans)
		return;
	if (wordlist[current] == endWord) {
		if (wordNum<min_trans){      //  ;因为前面已经确保wordNum<=min_trans了
			ans.clear();
			min_trans = wordNum;//千万不能忘记啊
		}
	    ans.push_back(path); //只要wordNum<=min_trans 
		return;
	}
	//遍历与current单词相差一个字母的单词
	for (int i = 0; i < v[current].size(); i++) {
		if (visited[v[current][i]] == false){
			visited[v[current][i]] = true;
			path.push_back(v[current][i]);
			process(v[current][i], wordNum + 1);
			//还原
			visited[v[current][i]] = false;
			path.pop_back();
		}
	}
}
int main() {
	init();
	visited[visited.size() - 1] = true;
	//*visited.end() = true;   //应该等价吧
	path.push_back(visited.size() - 1);
	process(visited.size() - 1, 1);
	cout << ans.size()<<endl;
	print();
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值