标签:ini idt therefore namespace correct close possible some bsp
题目:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 35295 | Accepted: 18998 |
Description
1033The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.
1733
3733
3739
3779
8779
8179
Input
Output
Sample Input
3 1033 8179 1373 8017 1033 1033
Sample Output
6 7 0
题意:
给出两个素数下x,y,问:每次只改变一个数的情况使得x变成y所需要的最少步数。
分析:
给出的数只有四个位且首位不为0,以x为起点,从0->9枚举每一位数算出从x向外搜索的素数,更新从x到该素数的最短步数,枚举完从当前点出发的所有素数后从队列中取出新起点,直到队列为空或者找到了目标素数。
AC code:
#include<cstdio> #include<cstring> using namespace std; struct node{ int k,step; }h[100005]; int s[10005]; bool u[10005]; int su[10005]; int num; void olas() { num=1; memset(u,true,sizeof(u)); u[1]=false; for(int i=2;i<=10000;i++) { if(u[i]) su[num++]=i; for(int j=1;j<num;j++) { if(i*su[j]>10000) break; u[i*su[j]]=false; if(i%su[j]==0) break; } } } int change(int x,int i,int j) { if(i==1) return (x/10)*10+j; else if(i==2) return (x/100)*100+j*10+x%10; else if(i==3) return (x/1000)*1000+j*100+x%100; else if(i==4) return j*1000+x%1000; } int main() { //freopen("input.txt","r",stdin); olas(); int t; scanf("%d",&t); while(t--) { int ans=-1; int x,y; scanf("%d%d",&x,&y); h[1].k=x; h[1].step=0; int l=1,r=1; memset(s,100,sizeof(s)); while(1) { if(h[l].k==y) { ans=h[l].step; break; } int ts,tk; for(int i=1;i<=4;i++) { for(int j=0;j<=9;j++) { if(!(j==0&&i==4)) { int tk=change(h[l].k,i,j); if(!u[tk]) continue; ts=h[l].step+1; if(s[tk]<=ts) continue; if(tk==y) { ans=ts; break; } s[tk]=ts; r++; h[r].k=tk; h[r].step=ts; } } } if(l==r||ans>=0) break; l++; } if(ans>=0) printf("%d\n",ans); else printf("Impossible\n"); } }
标签:ini idt therefore namespace correct close possible some bsp
原文地址:https://www.cnblogs.com/cautx/p/11525288.html