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;
}