他连连从棋盘的左上角出发,萨丽总是垂直(向上或者向下)或水平(向左或者向右)地走

P1560 [USACO5.2]蜗牛的远足Snail Trails

题材叙述

萨丽·斯内尔(Sally Snail,蜗牛)喜欢在N x N 的棋盘上闲逛(1 < n <=
120)。

他总是从棋盘的左上角出发。棋盘上有空的格子(用“.”来代表)和B
个路障(用“#”来表示)。

上边是这种表示法的以身作则棋盘:

亿万先生官方网站: 1

萨丽总是垂直(向上或者向下)或水平(向左或者向右)地走。她得以从出发地(总是记作A1
)向下仍旧向右走。一旦萨丽选定了一个趋势,她就会向来走下来。假诺他碰见棋盘边缘或者路障,她就停下来,并且转过90
度。她不可以离开棋盘,或者走进路障当中。并且,萨丽没有跨过他曾经经过的格子。当她再也不能够走的时候,她就止住散步。

那边是上边的棋盘上的五遍散步路线图示:

亿万先生官方网站: 2

萨丽向右走,再向下,向右,向下,然后向左,再升华,最后向右走。那时他遭受了一个她一度走过的格子,她就停下来了。可是,要是他在F5
格蒙受路障后选用此外一条路——向大家看来是左手的倾向转弯,意况就不等同了。

您的天职是总结并出口,若是萨丽聪明地选用她的路径的话,她所可以通过的最多格子数。

难题叙述

萨丽·斯内尔(Sally Snail,蜗牛)喜欢在N x N 的棋盘上闲逛(1 < n <=
120)。

他总是从棋盘的左上角出发。棋盘上有空的格子(用“.”来代表)和B
个路障(用“#”来表示)。

下边是这种表示法的示范棋盘:

亿万先生官方网站: 3

萨丽总是垂直(向上或者向下)或水平(向左或者向右)地走。她得以从出发地(总是记作A1
)向下或者向右走。一旦萨丽选定了一个方向,她就会平昔走下来。如若她遇到棋盘边缘或者路障,她就停下来,并且转过90
度。她不容许离开棋盘,或者走进路障当中。并且,萨丽没有跨过她早已经过的格子。当他再也不能走的时候,她就停下散步。

那边是地方的棋盘上的四回散步路线图示:

亿万先生官方网站: 4

萨丽向右走,再向下,向右,向下,然后向左,再升华,最后向右走。那时他相见了一个她一度渡过的格子,她就停下来了。可是,假如他在F5
格遭逢路障后选拔此外一条路——向大家看来是左手的来头转弯,景况就不平等了。

你的职分是精打细算并出口,倘若萨丽聪明地选取她的门路的话,她所可以由此的最多格子数。

输入输出格式

输入格式:

 

输入的首先行包罗N —棋盘的轻重缓急,和B —路障的多寡(1 <= B <=
200)。接下来的B
行包罗着路障的地点新闻。下边的样例输入对应着上边的言传身教棋盘。上面的出口文件表示难题的解答。注意,当N
> 26 时,输入文件就不可能代表Z
列将来的路障了。(那句话不用更加理她。其实就是从A 的ascii
码开头向后推移,不管是哪些字母就行了。)

 

出口格式:

 

出口文件应当只由一行组成,即萨丽可以透过的最多格子数。

 

输入输出格式

输入格式:

 

输入的率先行包涵N —棋盘的大大小小,和B —路障的数码(1 <= B <=
200)。接下来的B
行包罗着路障的岗位音讯。下边的样例输入对应着地点的演示棋盘。上面的出口文件表示难题的解答。注意,当N
> 26 时,输入文件就不可以代表Z
列未来的路障了。(那句话不用更加理她。其实就是从A 的ascii
码起初向后推移,不管是何等字母就行了。)

 

出口格式:

 

出口文件应当只由一行组成,即萨丽可以透过的最多格子数。

 

输入输出样例

输入样例#1:

8 4
E2
A6
G1
F5

输出样例#1:

33

输入输出样例

输入样例#1:

8 4
E2
A6
G1
F5

出口样例#1:

33

说明

亿万先生官方网站: 5

标题翻译来自NOCOW。

USACO Training Section 5.2

 

亿万先生官方网站:, 

dfs

帮zsq改的代码 

无意自己再写了233

屠龙宝刀点击就送

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#define N 210

using namespace std;
char ch[2];
int n,m,ans,x,y;
bool vis[N][N],vist[N][N];
int xx[4]={1,-1,0,0},yy[4]={0,0,1,-1};
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
int pd1(int x)
{
    if(x==0) return 2;
    if(x==1) return 2;
    if(x==2) return 1;
    if(x==3) return 1;
}
int pd2(int x)
{
    if(x==0) return 3;
    if(x==1) return 3;
    if(x==2) return 0;
    if(x==3) return 0;
}
void dfs(int x,int y,int s,int d)
{
    if(vis[x][y]) return ;
    ans=max(ans,s);
    int nx=x+xx[d],ny=y+yy[d],nd;
    vis[x][y]=true;
    if(nx>0&&ny>0&&nx<=n&&ny<=n&&!vist[nx][ny]) 
        dfs(nx,ny,s+1,d);
    else 
    {
        nd=pd1(d);
        nx=x+xx[nd],ny=y+yy[nd];
        if(nx>0&&ny>0&&ny<=n&&nx<=n&&!vist[nx][ny])
            dfs(nx,ny,s+1,nd);
        nd=pd2(d);
        nx=x+xx[nd],ny=y+yy[nd];
        if(nx>0&&ny>0&&ny<=n&&nx<=n&&!vist[nx][ny])
            dfs(nx,ny,s+1,nd);
    } 
    vis[x][y]=false;
}
int main()
{
    n=read(),m=read();
    int y;
    for(int i=1;i<=m;i++)
    {
        scanf("%1s%d",ch,&y);
        vist[ch[0]-'A'+1][y]=1;
    }
    dfs(1,1,1,0);
    memset(vis,0,sizeof(vis));
    dfs(1,1,1,2);
    printf("%d",ans);
    return 0;
}

 

说明

亿万先生官方网站: 6

题目翻译来自NOCOW。

USACO Training Section 5.2

 

 

找寻,注意输入的时候!!!以及边界条件!!

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 210
using namespace std;
char ch[2];
int n,m,ans,x,y;
bool vis[N][N],vist[N][N];
int xx[4]={1,-1,0,0},yy[4]={0,0,1,-1};
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
int pd1(int x)
{
    if(x==0) return 2;
    if(x==1) return 3;
    if(x==2) return 0;
    if(x==3) return 1;
}
int pd2(int x)
{
    if(x==0) return 3;
    if(x==1) return 2;
    if(x==2) return 1;
    if(x==3) return 0;
}
void dfs(int x,int y,int s,int d)
{
    if(vis[x][y]) return ;
    ans=max(ans,s);
    int nx=x+xx[d],ny=y+yy[d],nd;
    vis[x][y]=true;
    if(nx>0&&ny>0&&nx<=n&&ny<=n&&!vist[nx][ny]) 
      dfs(nx,ny,s+1,d);
    else 
    {
        nd=pd1(d);
        nx=x+xx[nd],ny=y+yy[nd];
        if(nx>0&&ny>0&&ny<=n&&nx<=n&&!vist[nx][ny])
         dfs(nx,ny,s+1,nd);
        nd=pd2(d);
        nx=x+xx[nd],ny=y+yy[nd];
        if(nx>0&&ny>0&&ny<=n&&nx<=n&&!vist[nx][ny]&&!vis[nx][ny])
         dfs(nx,ny,s+1,nd);
    } 
    vis[x][y]=false;
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=m;i++)
    {
        scanf("%1s",ch);  x=ch[0]-'A'+1;
        y=read(); vist[x][y]=1;
    }
    dfs(1,1,1,0);
    dfs(1,1,1,2);
    printf("%d",ans);
    return 0;
}

 

相关文章

网站地图xml地图