zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 52D(ARRAY,模拟最短路)

    #include<bits/stdc++.h>
    using namespace std;
    int n,x;
    int chess[17*17];//记录棋盘上的number
    array<int,2>pace[17*17*3][17*17*3],dp[17*17][3];//first记录root,second记录change
    array<int,2>operator+(const array<int,2>a,const array<int,2> b){
        return {a[0]+b[0],a[1]+b[1]};
    }
    int main(){
        memset(pace,1,sizeof(pace));//最大为1
        memset(dp,1,sizeof(dp));//最大为1
        scanf("%d",&n);
        for(int i=0;i<n*n;i++){
            scanf("%d",&x);
            x--;
            chess[x]=i;
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                for(int k=0;k<3;k++){
                    for(int l=0;l<3;l++){
                        pace[(i*n+j)*3+k][(i*n+j)*3+l]={1,1};//i*n后+j可以表示棋盘上n*n的所有位置,*3后可以用一维表示位置和用哪一种棋子走到这里的,不*3多开一维也可以
                    }
                }
                for(int k=0;k<n;k++){
                    for(int l=0;l<n;l++){
                        if(i==k||j==l)//车一步可以走到
                            pace[(i*n+j)*3][(k*n+l)*3]={1,0};
                        else if(abs(i-k)+abs(j-l)==3)//骑士一步可以走到
                            pace[(i*n+j)*3+2][(k*n+l)*3+2]={1,0};//+1用来区分是谁走的
                        if(i+j==k+l||i-j==k-l)//皇后一步可以走到
                        pace[(i*n+j)*3+1][(k*n+l)*3+1]={1,0};//+2用于区分
                    }
                }
            }
        }
        for(int k=0;k<n*n*3;k++){
            for(int i=0;i<n*n*3;i++){
                for(int j=0;j<n*n*3;j++){
                    pace[i][j]=min(pace[i][k]+pace[k][j],pace[i][j]);//最短路
                }
            }
        }
        dp[0][0]=dp[0][1]=dp[0][2]={};
        for(int i=1;i<n*n;i++){
            for(int j=0;j<3;j++){
                for(int k=0;k<3;k++){
                    dp[i][j]=min(dp[i-1][k]+pace[chess[i-1]*3+k][chess[i]*3+j],dp[i][j]);
                }
            }
        }
        array<int,2>a=min({dp[n*n-1][0],dp[n*n-1][1],dp[n*n-1][2]});//分别为初始的三种棋子,首先比较第一个元素选取最小,依次比较后续元素选取最小
        printf("%d %d",a[0],a[1]);
        return 0;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    UVa10820 Send a Table[欧拉函数]
    HDU2929 Bigger is Better[DP 打印方案 !]
    UVa11549计算器谜题[floyd判圈]
    洛谷U4807抽水机[最小生成树]
    CF149D. Coloring Brackets[区间DP !]
    POJ1651Multiplication Puzzle[区间DP]
    POJ2955Brackets[区间DP]
    POJ1129Channel Allocation[迭代加深搜索 四色定理]
    codevs1004四子连棋[BFS 哈希]
    codevs哈希水题
  • 原文地址:https://www.cnblogs.com/ldudxy/p/9787062.html
Copyright © 2011-2022 走看看