题目解析
思路
广度优先探索
每个坐标有3个选择(+1、-1、×2),将它们存入队列
分析
WA的原因
数组开小了
代码
一、
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
#define MAX 100005
int d[MAX];//开小了之后会wa
void bfs(){
int k=1;
queue<int>que;
que.push(k);
while(que.size()){
k=que.front();
que.pop();
if(k+1<MAX&&k+1>1&&d[k+1]==0)
{
que.push(k+1);
d[k+1]=d[k]+1;//连接的上一个数的耗时+1
}
if(k-1<MAX&&k-1>1&&d[k-1]==0){
que.push(k-1);
d[k-1]=d[k]+1;
}
if(k*2<MAX&&k*2>1&&d[k*2]==0){
que.push(k*2);
d[k*2]=d[k]+1;
}
}
}
int main(){
int T,x;
scanf("%d",&T);
memset(d,0,sizeof(d));
bfs();//避免超时求出所有的结果,取出所需要的
while(T--){
scanf("%d",&x);
printf("%d\n",d[x]);
}
return 0;
}
二、
#include<stdio.h>
#include<queue>
#include<string.h>
#define MAX 20
using namespace std;
int n;
struct Node{
int x,d;
}temp;
bool a[MAX+5];
queue<Node>q;
int bfs(int k){
memset(a,false,sizeof(a));
while(!q.empty())
q.pop();
temp.x=k;
temp.d=0;
q.push(temp);
while(!q.empty()){
temp=q.front();
q.pop();
int x=temp.x;
int d=temp.d;
if(a[x])continue;
if(x==n)
return d;
a[x]=true;
if(x<n&&!a[2*n])
{
temp.x=x*2;
temp.d=d+1;
q.push(temp);
}
if(x>1&&!a[x-1])
{
temp.x=x-1;
temp.d=d+1;
q.push(temp);
}
if(x+1<=n&&!a[x+1])
{
temp.x=x+1;
temp.d=d+1;
q.push(temp);
}
}
return 0;
}
int main(){
int T;
while(~scanf("%d",&T)){
while(T--){
scanf("%d",&n);
printf("%d\n",bfs(1));
}
}
return 0;
}