神奇的代码

810816659 2020-07-29 16:19:14 2020-07-29 16:24:36

#include<bits/stdc++.h>
using namespace std;

struct node{
	int ans;//记录转换次数 
	string s; 
	node(int a, string ss){
		ans = a;
		s = ss;
	}
};

bool cmp(string a, int l1, int r1, string b){//逐位比较a[l1] ~ a[r1]和b[0] ~ b[b.length() - 1]
	for(int i = l1, j = 0; i < r1; i++, j++){
		if(a[i] != b[j])
			return 0;
	}
	return 1;
}

int n;
string s, e;
string change[8], to[8];
bool kadd,kcut;

map<string, bool> st;//记录遍历过的字串 

queue<node> q;

int bfs(){
	q.push((node){0, s});
	st[s] = 1;
	
	
	while(!q.empty()){//广搜
	 
		node now = q.front();
		q.pop();
		
		if(now.ans >= 11)//如果搜的次数大于11就返回-1(输出"NO ANSWER!") 
			return -1;
		
		for(int k = 1; k <= n; k++){//遍历变换规则
			
			//可行性剪枝 
			if(now.s.length() < e.length() && !kadd)
				continue;
			if(now.s.length() > e.length() && !kcut)
				continue;
			
			
			if(now.s.length()<change[k].length())//string类型的.length()的返回值是unsigned long long 
				continue;
			for(int i = 0; i <= now.s.length() - change[k].length(); i++){//遍历now.s字串的每一位做首位与change[k]对比 
				
				if(!cmp(now.s, i, i + change[k].length(), change[k])) // 逐位对比 
					continue;
				
				
				//当相同时 
				string v(now.s);
				v.replace(v.begin() + i, v.begin() + i + change[k].length(), to[k]);

replace函数将s1的某个区间内的字符修改为指定字符

s1.replace(s1.begin(),s1.begin()+5,"要更改为的内容");

注意s1.begin(),s1.begin()+5 是左闭右开区间

				if(st[v])
					continue;
				st[v] = 1;
				
				if(v == e)//如果搜到结果返回步数 
					return now.ans + 1;
				q.push((node){now.ans + 1, v});
			}
		}
	}
	//搜不到返回-1 
	return -1;
}
int main()
{
	
	cin>>s>>e;
	kadd = 0;
	kcut = 0;
	for(int i = 1; i <= 6; i++){
		if(cin>>change[i]>>to[i])
			n = i;//鬼畜的输入
		
		//转换前的字串长度大于转换后的长度 kcut为true 
		if(change[i].length() > to[i].length())
			kcut = 1;
		
		//转换前的字串长度小于转换后的长度 kadd为true 
		if(change[i].length() < to[i].length())
			kadd = 1;
		
	}
	int awa = bfs();
	if(awa == -1)
		puts("NO ANSWER!"); 
	else
		printf("%d", awa);
}

共 1 条回复

xy0313

%%%%