做题吧

Catch That Cow

 POJ - 3278 

/*
广搜的实质:不断扩展当前状态能够扩展的状态。直到找到解。 
*/ 
//代码一直RE。没找到错误。 
//
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct step{
	int pos,count;
};
const int maxn=100010;
char vis[maxn];//标记数组 
int n,k;
queue<step> que;
int main(){
	cin>>n>>k;
	step s1;
	s1.pos=n;
	s1.count=0;
	memset(vis,0,sizeof(vis));
	vis[n]='1';
	
	que.push(s1);
	int tx;
	step tmp;
	while(!que.empty()){
		tmp=que.front();
		if(tmp.pos==k){
			cout<<tmp.count<<endl;
			return 0;
		}
		tx=tmp.pos-1;
		if(tx>=0&&tx<=1000000){
			if(vis[tx]=='\0'){
				s1.pos=tx;
				s1.count=tmp.count+1;
				que.push(s1);	
				vis[tx]='1';	
			}
		}
		if(tx==k) break;
		tx=tmp.pos+1;
		if(tx>=0&&tx<=1000000){
			if(vis[tx]=='\0'){
				s1.pos=tx;
			s1.count=tmp.count+1;
			que.push(s1);	
			vis[tx]='1';	
			}
			
		}
		if(tx==k) break;
		tx=tmp.pos*2;
		if(tx>=0&&tx<=1000000){
			if(vis[tx]=='\0'){
				s1.pos=tx;
			s1.count=tmp.count+1;
			que.push(s1);	
			vis[tx]='1';	
			}
			
		}
		if(tx==k) break;
		que.pop();
	}
	cout<<s1.count<<endl;
//	while(!que.empty()) que.pop();
	return 0;
}

 P0505

/*
搜一下,求阶乘尾0的数量。 
*/
#include<iostream>
using namespace std;
int main(){
	int n,t;
	cin>>n; t=1;
	for(int i=1;i<=n;i++){
		t*=i;
		while(t%10==0) t/=10;
		t=t%1000;
	}
	cout<<t%10<<endl;
	return 0; 
}
/*
但是这道题我们并不需要具体求出来这个数的阶乘是多少,我们需要做的就只是要求出来这个阶乘的从后往前数第一个不为0的数字。
以前写过求一个数的阶乘的后三位的,我们只需要把每次阶乘乘上后对1000取余即可。
这是因为,如果要求后面三位的话,我们只需要知道每次的后三位是什么就可以了,前面的数字不管如何,都对最后三位没有影响。

但是这道题并不能单纯的求出后几位然后找,因为可能后面好几位的全部都是0,我们不能够确定要求的是后几位。所以我们可以把每次计算出来的数先把最后的0全部去掉,再取余,我们虽然是要求的最后一位部位0的,也不能仅仅对于10 取余,
因为如果下次乘上求得的数的最后一位为0,且需要进位的话,进位后的数字就不正确了。
*/

Poj 3126(还没改呢)

/*
质数=素数 奇数=单数
题意: 多组输入,每组给定两个四位素数(无前导零)。
对小的那个素数,每次变其中的一个字符,变一次成本+1.
问:最少变多少次,才能变成大的那个素数?
思路:广搜。对每一个素数,依次把他的四位都变一下。如果变成了素数
则耗散值+1,入队。
(广搜的实质:不断扩展当前状态能够扩展的状态。直到找到解。) 
一定要注意的是:标记下来已经扩展过的点,防止死循环。 
*/
#include<iostream>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
char vis[10005];
typedef struct{
	int num,spend;
}Num;
bool Judge(int i,int fron_num){
	int cnt=0;
	while(i>0){
		int t1=i%10;
		int t2=fron_num%10;
		if(t1!=t2) cnt++;
		i/=10;
		fron_num/=10;
	}
	return cnt==1;
}
bool is_prime(int i){
	for(int c=2;c*c<=i;c++) 
		if(i%c==0) return false;
	return true;
}
int main(){
	int n;
	cin>>n;
	while(n--){
		int da,xiao,tmp;
		cin>>da>>xiao;
		memset(vis,0,sizeof(vis));
		if(xiao>da){
			tmp=xiao;
			xiao=da;
			da=tmp;
		}else if(xiao==da){
			cout<<"0\n";
			break;
		}
		Num tt; 
		tt.num=xiao;
		tt.spend=0;
		queue<Num> qu;
		qu.push(tt);
		vis[xiao]=1;
		bool flag=true;
		int maxn=0;
		while(!qu.empty()){
			int fron_num=qu.front().num;
			cout<<"*";
			for(int i=fron_num;i<=da;i+=2){
				if(is_prime(i)&&Judge(i,fron_num)&&!vis[i]){
				if(i>maxn){
					cout<<i<<"*";
					maxn=i;
				}
					Num tt2;
					tt2.num=i;
			//		cout<<"**"<<tt2.num<<"**"<<endl;
					tt2.spend=qu.front().spend+1;
					qu.push(tt2);
					vis[i]=1;
					if(i==da){
						cout<<"i="<<i<<endl;
						flag=false;
						cout<<qu.front().spend+1<<endl;
						break;
					}
				}
			}
			qu.pop();
			if(!flag) break;
		}
	} 
	return 0;
}
发布了77 篇原创文章 · 获赞 11 · 访问量 4976

猜你喜欢

转载自blog.csdn.net/qq_43346054/article/details/104648663