zoukankan      html  css  js  c++  java
  • UVA 116 Unidirectional TSP

    UVA_116

        这个题目可以用记忆化搜索实现,由于矩阵中的数字不全为正,故可以把INF作为还没有搜索过的标记。由于要求字典序最小,所以分情况控制好搜索顺序即可。

    #include<stdio.h>
    #include<string.h>
    #define INF 1000000000
    int R, C, a[20][110], f[20][110], next[2200];
    void init()
    {
    int i, j;
    for(i = 0; i < R; i ++)
    for(j = 0; j < C; j ++)
    scanf("%d", &a[i][j]);
    }
    int dfs(int x, int y)
    {
    int i, j, k, newx, min;
    if(f[x][y] != INF)
    return f[x][y];
    min = INF;
    if(x == 0)
    {
    for(i = 0; i < 2; i ++)
    {
    if(x + i >= R)
    break;
    newx = x + i;
    k = dfs(newx, y + 1);
    if(k < min)
    {
    min = k;
    next[x * C + y] = newx * C + y + 1;
    }
    }
    newx = R - 1;
    k = dfs(newx, y + 1);
    if(k < min)
    {
    min = k;
    next[x * C + y] = newx * C + y + 1;
    }
    }
    else if(x == R - 1)
    {
    newx = 0;
    k = dfs(newx, y + 1);
    if(k < min)
    {
    min = k;
    next[x * C + y] = newx * C + y + 1;
    }
    for(i = -1; i < 1; i ++)
    {
    newx = x + i;
    k = dfs(newx, y + 1);
    if(k < min)
    {
    min = k;
    next[x * C + y] = newx * C + y + 1;
    }
    }
    }
    else
    {
    for(i = -1; i < 2; i ++)
    {
    newx = x + i;
    k = dfs(newx, y + 1);
    if(k < min)
    {
    min = k;
    next[x * C + y] = newx * C + y + 1;
    }
    }
    }
    return f[x][y] = min + a[x][y];
    }
    void printresult(int z, int flag)
    {
    if(flag)
    printf("");
    else
    flag = 1;
    printf("%d", z / C + 1);
    if(next[z] != -1)
    printresult(next[z], flag);
    }
    void solve()
    {
    int i, j, k, min, z;
    for(i = 0; i < R; i ++)
    for(j = 0; j < C; j ++)
    f[i][j] = INF;
    memset(next, -1, sizeof(next));
    for(i = 0; i < R; i ++)
    f[i][C - 1] = a[i][C - 1];
    min = INF;
    for(i = 0; i < R; i ++)
    {
    k = dfs(i, 0);
    if(k < min)
    {
    min = k;
    z = i * C;
    }
    }
    printresult(z, 0);
    printf("\n");
    printf("%d\n", min);
    }
    int main()
    {
    while(scanf("%d%d", &R, &C) == 2)
    {
    init();
    solve();
    }
    return 0;
    }


  • 相关阅读:
    @Value映射到静态属性
    使用RestTemplateBuilder来实例化RestTemplate对象
    数组转String
    Springboot中mybatis配置
    pagehelper配置 多数据源自动切换数据库方言 mysql/sqlserver/oracle等数据库
    SpringBoot调用mybatis-config.xml的方法
    单元测试中模拟mvc测试对象MockMvc
    获取请求体中图片的二进制流直接解析成图片
    zk保证定时任务集群部署时单个节点执行
    Spring框架:BeanFactory容器
  • 原文地址:https://www.cnblogs.com/staginner/p/2234962.html
Copyright © 2011-2022 走看看