zoukankan      html  css  js  c++  java
  • [Usaco2017 Feb]Why Did the Cow Cross the Road I (Gold)

    Description
    有一幅n*n的方格图,n <=100,每个点上有一个值。
    从(1,1)出发,走到(n,n),只能走上下左右。
    每走一步花费t,每走三步需要花费走完三步后到达格子的值。
    求最小花费的值。

    Sample Input
    4 2
    30 92 36 10
    38 85 60 16
    41 13 5 68
    20 97 13 80

    Sample Output
    31


    这题有两种思想,可以强行上一个三维广搜,不过我们也可以用奇技淫巧将第三维省去,因为走三步总共只有16种状态。所以我们就可以强上广搜了。最后只要把那些可以在3步内可以到(n,n)的点特判一下就好了

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define inf 0x7f7f7f7f
    using namespace std;
    typedef long long ll;
    typedef unsigned int ui;
    typedef unsigned long long ull;
    inline int read(){
    	int x=0,f=1;char ch=getchar();
    	for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')    f=-1;
    	for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<1)+(x<<3)+ch-'0';
    	return x*f;
    }
    inline void print(int x){
    	if (x>=10)     print(x/10);
    	putchar(x%10+'0');
    }
    const int N=1e2;
    const int dx[16]={-3,-2,-2,-1,-1,-1,0,0,0,0,1,1,1,2,2,3};
    const int dy[16]={0,-1,1,-2,0,2,-3,-1,1,3,-2,0,2,-1,1,0};
    struct AC{
    	int x,y;
    	void join(int a,int b){x=a,y=b;}
    }h[N*N*16+10];
    int map[N+10][N+10],dis[N+10][N+10];
    bool vis[N+10][N+10];
    int n,t;
    int in_map(int x,int y){return x>0&&x<=n&&y>0&&y<=n;}
    void Bfs(int x,int y){
    	int head=1,tail=1;
    	memset(dis,63,sizeof(dis));
    	h[1].join(x,y),vis[x][y]=1,dis[x][y]=0;
    	for (;head<=tail;head++){
    		int nx=h[head].x,ny=h[head].y;
    		for (int i=0;i<16;i++){
    			int tx=nx+dx[i],ty=ny+dy[i];
    			if (!in_map(tx,ty))	continue;
    			if (dis[tx][ty]>dis[nx][ny]+map[tx][ty]+3*t){
    				dis[tx][ty]=dis[nx][ny]+map[tx][ty]+3*t;
    				if (!vis[tx][ty])	h[++tail].join(tx,ty),vis[tx][ty]=1;
    			}
    		}
    		vis[nx][ny]=0;
    	}
    }
    int main(){
    	n=read(),t=read();
    	for (int i=1;i<=n;i++)	for (int j=1;j<=n;j++)	map[i][j]=read();
    	Bfs(1,1);
    	for (int x=0;x<3;x++)
    		for (int y=0;y<3;y++)
    			if (x+y<3)
    				dis[n][n]=min(dis[n][n],dis[n-x][n-y]+t*(x+y));
    	printf("%d
    ",dis[n][n]);
    	return 0;
    }
    
  • 相关阅读:
    node.js 基础篇
    node.js 开发环境搭建
    Velocity VelocityEngine 支持多种loader 乱码问题
    tomcat集群及session共享
    上海支付宝终面后等了两周,没能收到offer却来了杭州淘宝的电话面试
    支付宝hr终面,忐忑的等待结果
    mysql 数据范围总结
    rsync同步文件(多台机器同步代码...)
    linux基础命令
    路飞学城项目之前后端交互,跨域问题
  • 原文地址:https://www.cnblogs.com/Wolfycz/p/8414386.html
Copyright © 2011-2022 走看看