题意:简单的说就是:有一个人门牌号是一个四位数的整数,并且还是一个素数,现在他想要换成另外一个四位数且是素数的门牌号,而且,每次都只能更换这个四位数的一个位置的数 ,也就是每换一次都只改变一个数字,而且对于这个每换一个位置的数字就要花费一个单位的价格,那么,为了节约,问他从现在的这个门牌号换到想要的那个门牌号最少要多少次(也就是最少花费)

题意很明确,最少次数用bfs,菜鸟刚做搜索觉得难点在于处理每一个四位数的整数变化过程

这里我们把这个四位数的整数拆开成一个 a[4]的数组,sum就是这个数的大小,那么bfs访问过程中就是要对于sum这个整数的1~4个位置用别的数字(0~9这9个数字)看能否替换,能替换的条件包括:

1、之前没有出现过这个四位数,这里我们用flag[10][10][10][10]这个四维数组来标记,(哎哎....这里很是没有必要,浪费不少空间,不过菜鸟就只能想到这个判断方式,应该也许可以用字典树判重)

2、这个数字的某一位被替换之后形成新的数字是一个素数。。

上马:

#include<cstdio>
#include<queue>
#include<cmath>
using namespace std; struct node//当前数字的状态,用数组保存每一位,这里是四位数数字
{
int a[4];//把sum的每一位分解
int sum;// 对于每个四位数数字要素数判断,就要用到,其实sum才是这个数,
int step;//次数
}start,end; bool flag[10][10][10][10]; bool sushu(int p)//素数判断
{
for(int i=2;i<=sqrt((double)p);i++)//这里注意把p转换为double,还有 i <= sqrt,比如对于4,如果漏掉 = 就会判断为素数
{
if(p%i==0)
return false;
}
return true;
}
//这里写得有点挫....
bool work(int i,int j,node &p)//可以用一个for进行简化
{
p.a[i]=j;
if(i==0)
{
p.sum=j*1000+p.a[1]*100+p.a[2]*10+p.a[3];
if(!sushu(p.sum) || flag[j][p.a[1]][p.a[2]][p.a[3]])
return false;
}
else if(i==1)
{
p.sum=p.a[0]*1000+j*100+p.a[2]*10+p.a[3];
if(!sushu(p.sum) || flag[p.a[0]][j][p.a[2]][p.a[3]])
return false;
}
else if(i==2)
{
p.sum=p.a[0]*1000+p.a[1]*100+j*10+p.a[3];
if(!sushu(p.sum) || flag[p.a[0]][p.a[1]][j][p.a[3]])
return false;
}
else
{
p.sum=p.a[0]*1000+p.a[1]*100+p.a[2]*10+p.a[3];
if(!sushu(p.sum) || flag[p.a[0]][p.a[1]][p.a[2]][p.a[3]])
return false;
}
flag[p.a[0]][p.a[1]][p.a[2]][p.a[3]]=true;
return true;
} int bfs()
{
queue<node>q;
start.step=0;
q.push(start);
flag[start.a[0]][start.a[1]][start.a[2]][start.a[3]]=true; while(!q.empty())
{
node pre=q.front();q.pop();
if(pre.a[0]==end.a[0]&&pre.a[1]==end.a[1]&&pre.a[2]==end.a[2]&&pre.a[3]==end.a[3])
return pre.step; for(int i=0;i<4;i++)//查看pre的a[0]到a[3]
{
node pp=pre;
for(int j=0;j<=9;j++)//a[i]从0填到9
if(!(i==0&&j==0) && j!=pre.a[i] && work(i,j,pp))//对于首尾,i=0不用考虑0这种情况,那样就只有三位数啦
{
pp.step=pre.step+1;
q.push(pp);
}
}
}
return 0;
} int main()
{
char c1[5],c2[5];
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s%s",c1,c2);//先做字符串输入
start.sum=end.sum=0;
memset(flag,false,sizeof(flag)); for(int i=0;i<4;i++)
{
start.a[i]=c1[i]-'0';//这里把字符串处理为数字数组
start.sum=start.sum*10+start.a[i];
end.a[i]=c2[i]-'0';
end.sum=end.sum*10+end.a[i];
} printf("%d\n",bfs());
}
return 0;
}

个人愚昧观点..欢迎指正和讨论

poj3126解题报告的更多相关文章

  1. poj分类解题报告索引

    图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...

  2. 北大ACM试题分类+部分解题报告链接

    转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...

  3. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  4. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  5. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  6. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  7. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  8. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  9. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

随机推荐

  1. Delphi的DLL里如何实现定时器功能?

    一,首先引入“mmsystem”单元. 二,启动定时器: var MMTimerID: Integer; // 定时器ID MMTimerID := timeSetEvent(1000, 0, @Ti ...

  2. 【ASP.NET Web API教程】2.3.7 创建首页

    原文:[ASP.NET Web API教程]2.3.7 创建首页 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. Part 7: Crea ...

  3. 基于Hadoop技术实现的离线电商分析平台(Flume、Hadoop、Hbase、SpringMVC、highcharts)

    离线数据分析平台是一种利用hadoop集群开发工具的一种方式,主要作用是帮助公司对网站的应用有一个比较好的了解.尤其是在电商.旅游.银行.证券.游戏等领域有非常广泛,因为这些领域对数据和用户的特性把握 ...

  4. java.lang.ClassCastException: sun.proxy.$Proxy11 cannot be cast to分析

    报这个错,只有一个原因,就是你转化的类型不对. 如果你的类是一个单实体类,也就是没有继承或是接口别的类. public class HjmServiceImpl {} 那么这样写就可以: HjmSer ...

  5. ASP.Net状态管理读书笔记--思维导图

    课前提问几个问题 使用Session 配置 model aspnet_regsql.exe 常见问答 问:为什么Session在有些机器上偶尔会丢失?答:可能和机器的环境有关系,比如:防火墙或者杀毒软 ...

  6. 不是技术牛人,如何拿到国内IT巨头的Offer(转)

    不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic…在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技术屌 ...

  7. cocos2d 游戏开发:Cocos2d v3 &quot;hello world&quot;+显示飞船

    V3 RC4 版本号图片 显示一个飞船 将Chapter1中 SpaceCargoShip.png 文件 加入到项目里面. 代码在 init : CCSprite *spaceCargoShip = ...

  8. codeforces 325B Stadium and Games

    这道题思路很简单,设刚开始队伍数为d=2^p*x,其中x是奇数,则比赛场次n=(2^p-1)*x+(x-1)*x/2,然后从0开始枚举p的值,接着解一元二次方程x^2+(2^(p+1)-3)x-2*n ...

  9. 8张图理解Java(转)

    一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选.如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟. 1.字符串不变性 下面这张图展示了这段代码做 ...

  10. grep与正则表达式,grep、egrep和fgrep

    grep用法详解:grep与正则表达式 首先要记住的是: 正则表达式与通配符不一样,它们表示的含义并不相同!正则表达式只是一种表示法,只要工具支持这种表示法, 那么该工具就可以处理正则表达式的字符串. ...