多语言展示
当前在线:193今日阅读:86今日分享:14

usaco 2.4.2 Overfencing

本题的大体意思是。给你一个如下图所示的迷宫。加减号是栅栏。每个图都有两个出口。输入迷宫的宽度W(1<=W<=38)及高度H(1<=H<=100)。(2*H+1行,每行2*W+1的字符).求距离迷宫出口最远的点的要走出迷宫的步数。
工具/原料
1

usaco官网

2

电脑,编译器

方法/步骤
1

这道题我被卡了好久。原因就在于输入搞错了。好吧主要还是我基本功不扎实。一下是我改正后的输入部分。

2

int w[i][j]表示i行j列如果是障碍则为0;通道则为1. int s[i][j]表示到i行j列的最短路径。比较懒,直接用递归做的。递归分别从两个入口开始。初始化s全部为100000(第一次因为这个数开得太小了就没过)。为了剪枝。如果搜索i,j时走过的路径比原来记录的大的话就剪枝。否则记录。一下是移动方程。

3

还要注意一点。记录的s并不直接是步数。而是(步数+1)/2 !!!!!这个地方我也错了一回。

4

一下是我的代码: #include#include#include#include#include#define FF for(i=0;i0&&w[i-1][j]&&s[i-1][j]>s[i][j]+1){s[i-1][j]=s[i][j]+1;move(i-1,j);}if(j-1>0&&w[i][j-1]&&s[i][j-1]>s[i][j]+1){s[i][j-1]=s[i][j]+1;move(i,j-1);}if(i+1s[i][j]+1){s[i+1][j]=s[i][j]+1;move(i+1,j);}if(j+1s[i][j]+1){s[i][j+1]=s[i][j]+1;move(i,j+1);}}int main(){int ai,aj,bi,bj;ai=-1;int i,j,k;string tmp;for(i=0;i<202;i++){for(j=0;j<80;j++)s[i][j]=100000;}freopen('maze1.in','r',stdin);freopen('maze1.out','w',stdout);cin>>W>>H;getchar();W=W*2+1;H=H*2+1;for(i=0;imax){max=s[i][j];}}printf('%d\n',(max+1)/2);return 0; }

推荐信息