HDU1973 http://acm.hdu.edu.cn/showproblem.php?pid=1973

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
#include<math.h>
#define N 10010

using namespace std;

int vis[N];
char s1[5], s2[5], s3[5];

struct node
{
    int step;
    char st[5];
};

int prime(int y)
{
    int i, k = (int)sqrt(y);
    for(i = 2 ; i <= k ; i++)
        if(y % i == 0)
            return 0;
    return 1;
}

int BFS(char s[])
{
    queue<node>Q;
    node now, next;
    int i, j, h, x = 0;
    memset(vis, 0, sizeof(vis));
    memset(s3, 0, sizeof(s3));
    for(i = 0 ; i < 4 ; i++)
        x = x * 10 + (s[i] - ‘0‘);
    vis[x] = 1;
    strcpy(now.st, s);
    now.step = 0;
    Q.push(now);
    while(!Q.empty())
    {
        now = Q.front();
        Q.pop();
        if(strcmp(now.st, s2) == 0)
            return now.step;
        for(i = 0 ; i < 4 ; i++)//各个位(即个位,十位,百位,千位)
        {
            for(j = 0 ; j < 10 ; j++)//0到9十个数
            {
                if(i == 0 && j == 0)//千位不为0
                    continue;
                if(now.st[i] == j + ‘0‘)//原有的数不需要替换
                    continue;
                strcpy(s3, now.st);
                now.st[i] = j + ‘0‘;//0到9其中的一个数去替换四位数气中的一位
                x = 0;
                for(h = 0 ; h < 4 ; h++)
                    x = x * 10 + (now.st[h] - ‘0‘);
                if(prime(x) == 1 && !vis[x])
                {
                    vis[x] = 1;
                    next.step = now.step + 1;
                    strcpy(next.st, now.st);
                    i = 0;/***/
                    j = 0;/***/
                    Q.push(next);
                }
                strcpy(now.st, s3);
            }
        }
    }
    return -1;
}

int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%s%s", s1, s2);
        printf("%d\n", BFS(s1));
    }
    return 0;
}
时间: 2024-10-10 22:11:02

HDU1973 http://acm.hdu.edu.cn/showproblem.php?pid=1973的相关文章

HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少是多少? 因为每次相邻的交换操作最多只能减少一个逆序对,所以最多可以减少k个逆序对,所以我们只要求出原来的序列有多少个逆序对然后减去k再跟0取较大的就可以了. 因为数据范围是10的五次方,所以暴力求肯定会TLE,所以要用n*logn算法求逆序对,n*logn算法有几种可以求逆序对的: 线段树,树状数

HDU-4632 http://acm.hdu.edu.cn/showproblem.php?pid=4632

http://acm.hdu.edu.cn/showproblem.php?pid=4632 题意: 一个字符串,有多少个subsequence是回文串. 别人的题解: 用dp[i][j]表示这一段里有多少个回文串,那首先dp[i][j]=dp[i+1][j]+dp[i][j-1],但是dp[i+1][j]和dp[i][j-1]可能有公共部分,所以要减去dp[i+1][j-1]. 如果str[i]==str[j]的话,还要加上dp[i+1][j-1]+1. 但是自己却是这样想的,把每个区间都要看

http://acm.hdu.edu.cn/showproblem.php?pid=2825

地址:http://acm.hdu.edu.cn/showproblem.php?pid=2825 题目: Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6862    Accepted Submission(s): 2279 Problem Description Liyuan lives in a

字符串处理 最佳裁判http://acm.hdu.edu.cn/showproblem.php?pid=4520

#include <stdio.h> int main() { int N; scanf("%d",&N);//先输入 double a[N],b[N],c,d=0,o[N-1],e,f;//这里定义3个数组下面会用到 for (int i=0; i<N; i++) { scanf("%lf",&a[i]); b[i]=a[i];//得到2个一样的数组,因为有一个数组因为排序要改变 } for (int i=0; i<N-1;

Help him http://acm.hdu.edu.cn/showproblem.php?pid=5059

题目是昨天晚上的BC.昨天晚上一直卡在第二题,囧. 今天看到题解之后,觉得自己想的也是差不多的,该考虑的也考虑到的.究竟是为什么会错.然后我就改了交,改了交.终于让我改对了一次,我找到了自己的代码中哪段有问题. 接下来上代码: wa code: int but=0; if(!sig) but=1; else but=0; long long c=0,r=1; for(int i=strlen(str)-1; i>=but; i--) { //not digit if(str[i]<'0'||s

饭卡 (背包01) http://acm.hdu.edu.cn/showproblem.php?pid=2546

/* 从一组数据中选出n个数,使这n个数的和最接近一个值x, 背包问题, 从一系列菜中,从最贵的菜(MAX)之外中选出几个菜,使菜的总价格sum最接近money-5:money-sum-MAX; 钱数相当于背包总容量,菜相当于价值和体积一样物品: */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int d

HDU 1455 http://acm.hdu.edu.cn/showproblem.php?pid=1455

#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #define N 70 int f, vis[N], v, n, a[N]; int cmp(const void *a, const void *b) { return *(int *)b - *(int *)a; } void DFS(int w, int sum) { int i; if(sum == 0)

HDU5122 http://acm.hdu.edu.cn/showproblem.php?pid=5122

1 #include <stdio.h> 2 #include <string.h> 3 int s[1011010]; 4 int main() 5 { 6 int T,sum,n,f; 7 scanf("%d",&T); 8 f=0; 9 while(T--) 10 { 11 f++; 12 scanf("%d",&n); 13 for(int i=0;i<n;i++) 14 { 15 scanf("%d&

http://acm.hdu.edu.cn/showproblem.php?pid=2579

#include<stdio.h> #include<string.h> #include<queue> #define N 110 int m, n, k, x1, x2, y1, y2; char map[N][N]; int v[N][N][N];//当时间是k的倍数时,障碍消失,之后又重现,所以在平时使用的二维标记数组中再加一维 int d[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; using namespace s