3 1033 8179 1373 8017 1033 1033
6 7 0
这个题还是比较简单的。但是操作比较复杂,整理操作的时候容易出错,这里我们为了优化代码,耗时减少,我们打印素数表的时候使用快速打印的方式:
for(int j=2;j<sqrt(max);j++) { if(Is_or[j]==0)//去掉合数的倍数. for(int k=j+j;k<=max;k+=j)//去掉倍数.(把这么些个合数的倍数都标记上这个数不是素数.) Is_or[k]=1;//这里表示合数为1 素数为0; }我们有了素数表之后,就可以判断变化的数字是否是素数了。
我们这里利用广搜来做:
贴上完整的AC代码:
#include<stdio.h> #include<queue> #include<math.h> #include<string.h> using namespace std; struct shusu { int num[4]; int output; }now,nex; #define max 10005 int Is_or[max];//0是素数 int mubiao[4]; int vis[10][10][10][10];//vis函数我们这里用四维. char a[5]; char b[5]; void bfs() { memset(vis,0,sizeof(vis)); for(int i=0;i<4;i++) { now.num[i]=a[i]-'0'; mubiao[i]=b[i]-'0'; } now.output=0; vis[now.num[0]][now.num[1]][now.num[2]][now.num[3]]=1; queue<shusu>s; s.push(now); while(!s.empty()) { now=s.front(); //printf("%d%d%d%d",now.num[0],now.num[1],now.num[2],now.num[3]); if(now.num[0]==mubiao[0]&&now.num[1]==mubiao[1]&&now.num[2]==mubiao[2]&&now.num[3]==mubiao[3]) { printf("%d\n",now.output); return ; } s.pop(); for(int i=0;i<4;i++) { if(i==0) { for(int j=1;j<=9;j++)//这里注意,千位数字不能是0,如果有0,是会WA的. { nex=now; if(j!=now.num[0]) nex.num[0]=j; int sum=nex.num[3]+10*nex.num[2]+100*nex.num[1]+1000*nex.num[0]; if(Is_or[sum]==0&&vis[nex.num[0]][nex.num[1]][nex.num[2]][nex.num[3]]==0) { //printf("%d\n",sum); nex.output=now.output+1; s.push(nex); vis[nex.num[0]][nex.num[1]][nex.num[2]][nex.num[3]]=1; } } } if(i==1) { for(int j=0;j<=9;j++) { nex=now; if(j!=now.num[1]) nex.num[1]=j; int sum=nex.num[3]+10*nex.num[2]+100*nex.num[1]+1000*nex.num[0]; //printf("%d %d %d %d\n",nex.num[0],nex.num[1],nex.num[2],nex.num[3]); if(Is_or[sum]==0&& vis[nex.num[0]][nex.num[1]][nex.num[2]][nex.num[3]]==0) { //printf("%d\n",sum); nex.output=now.output+1; s.push(nex); vis[nex.num[0]][nex.num[1]][nex.num[2]][nex.num[3]]=1; } } } if(i==2) { for(int j=0;j<=9;j++) { nex=now; if(j!=now.num[2]) nex.num[2]=j; int sum=nex.num[3]+10*nex.num[2]+100*nex.num[1]+1000*nex.num[0]; if(Is_or[sum]==0&& vis[nex.num[0]][nex.num[1]][nex.num[2]][nex.num[3]]==0) { //printf("%d\n",sum); nex.output=now.output+1; s.push(nex); vis[nex.num[0]][nex.num[1]][nex.num[2]][nex.num[3]]=1; } } } if(i==3) { for(int j=0;j<=9;j++) { nex=now; if(j!=now.num[3]) nex.num[3]=j; int sum=nex.num[3]+10*nex.num[2]+100*nex.num[1]+1000*nex.num[0]; if(Is_or[sum]==0&& vis[nex.num[0]][nex.num[1]][nex.num[2]][nex.num[3]]==0) { // printf("%d\n",sum); nex.output=now.output+1; s.push(nex); vis[nex.num[0]][nex.num[1]][nex.num[2]][nex.num[3]]=1; } } } } } printf("Impossible\n"); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s%s",a,b); //秒打印素数表. for(int j=2;j<sqrt(max);j++) { if(Is_or[j]==0)//去掉合数的倍数. for(int k=j+j;k<=max;k+=j)//去掉倍数.(把这么些个合数的倍数都标记上这个数不是素数.) Is_or[k]=1; } //printf("%d %d\n",Is_or[1033],Is_or[1733]); bfs(); /*for(int i=1;i<50;i++) { printf("%d ",Is_or[i]); }*/ } }