usaco 2.4.2 Overfencing

2026-02-15 18:28:50

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

 

usaco 2.4.2 Overfencing

2、int w[i][j]表示i行j列如果是障碍则为0;通道则为1.

int s[i][j]表示到i行j列的最短路径。

比较懒,直接用递归做的。递归分别从两个入口开始。初始化s全部为100000(第一次因为这个数开得太小了就没过)。为了剪枝。如果搜索i,j时走过的路径比原来记录的大的话就剪枝。否则记录。一下是移动方程。

usaco 2.4.2 Overfencing

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

4、一下是我的代码:

#include<stdio.h>

#include<string.h>

#include<sstream>

#include<string>

#include<iostream>

#define FF for(i=0;i<H;i++) for(j=0;j<W;j++)

using namespace std;

int s[202][80];

int H,W;

int w[202][80];

void move(int i,int j){

if(i-1>0&&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+1<H&&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<W&&w[i][j+1]&&s[i][j+1]>s[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;i<H;i++)

{

getline(cin,tmp);

for(j=0;j<W;j++){

if(tmp[j]==' '){

w[i][j]=1;

if(i==0||i==H-1||j==0||j==W-1){

if(ai==-1){

ai=i;

aj=j;

}

else{

bi=i;

bj=j;

}

}

}

else w[i][j]=0;

}

tmp.clear();

}

s[ai][aj]=0;

s[bi][bj]=0;

move(ai,aj);

move(bi,bj);

int max=0;

FF{

if(s[i][j]!=100000&&s[i][j]>max){

max=s[i][j];

}

}

printf("%d\n",(max+1)/2);

return 0;

}

 

usaco 2.4.2 Overfencing

相关推荐
  • 阅读量:36
  • 阅读量:153
  • 阅读量:56
  • 阅读量:147
  • 阅读量:119
  • 猜你喜欢