五月三号训练赛

23 篇文章 0 订阅


A - O

Description

Dr. Fukuoka has placed a simple robot in a two-dimensional maze. It moves within the maze and never goes out of the maze as there is no exit.

The maze is made up of H × W grid cells as depicted below. The upper side of the maze faces north. Consequently, the right, lower and left sides face east, south and west respectively. Each cell is either empty or wall and has the coordinates of (ij) where the north-west corner has (1, 1). The row i goes up toward the south and the column j toward the east.

The robot moves on empty cells and faces north, east, south or west. It goes forward when there is an empty cell in front, and rotates 90 degrees to the right when it comes in front of a wall cell or on the edge of the maze. It cannot enter the wall cells. It stops right after moving forward by L cells.

Your mission is, given the initial position and direction of the robot and the number of steps, to write a program to calculate the final position and direction of the robot.

Input

The input is a sequence of datasets. Each dataset is formatted as follows.

H W L
c
1,1c1,2...c1,W
.
.
.
cH,1cH,2...cH,W

The first line of a dataset contains three integers HW and L (1 ≤ HW ≤ 100, 1 ≤ L ≤ 1018).

Each of the following H lines contains exactly W characters. In the i-th line, the j-th character ci,j represents a cell at (ij) of the maze. "." denotes an empty cell. "#" denotes a wall cell. "N", "E", "S", "W" denote a robot on an empty cell facing north, east, south and west respectively; it indicates the initial position and direction of the robot.

You can assume that there is at least one empty cell adjacent to the initial position of the robot.

The end of input is indicated by a line with three zeros. This line is not part of any dataset.

Output

For each dataset, output in a line the final row, column and direction of the robot, separated by a single space. The direction should be one of the following: "N" (north), "E" (east), "S" (south) and "W" (west).

No extra spaces or characters are allowed.

Sample Input

3 3 10
E..
.#.
...
5 5 19
####.
.....
.#S#.
...#.
#.##.
5 5 6
#.#..
#....
##.#.
#..S.
#....
5 4 35
..##
....
.##.
.#S.
...#
0 0 0

Output for the Sample Input

1 3 E
4 5 S
4 4 E
1 1 N

很像dfs,bfs,但有方向,vis[i][j][k]记录这个点的这个方向是不是走过,id[i][j][k]表示第一次走到这的步数;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110;
int H,W,cnt;
int sx,sy,sd;
long long L;
char grid[maxn][maxn];
int vis[maxn][maxn][4],id[maxn][maxn][4];
int di[][2]={{-1,0},{0,1},{1,0},{0,-1}};
int DIR(char d)
{
    if(d=='S')return 2;
    if(d=='W')return 3;
    if(d=='N')return 0;
    return 1;
}
int move(int &x,int &y,int &d)
{
    int tx,ty;
    for(int i=0;i<4;i++)
    {
        tx=x+di[d][0];
        ty=y+di[d][1];
        if(tx<1||tx>H||ty<1||ty>W||grid[tx][ty]=='#'){d=(d+1)%4;continue;}
        break;
    }
    x=tx,y=ty;
    if(vis[x][y][d])return id[x][y][d];
    vis[x][y][d]=1;
    id[x][y][d]=cnt++;
    return 0;
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d%d%lld",&H,&W,&L)!=EOF,H+W+L)
    {
        for(int i=1;i<=H;i++)
        {
            scanf("%s",grid[i]+1);
            for(int j=1;j<=W;j++)
            {
                if(grid[i][j]=='.'||grid[i][j]=='#')continue;
                sx=i,sy=j;
                sd=DIR(grid[i][j]);
            }
        }
        memset(vis,0,sizeof(vis));
        memset(id,0,sizeof(id));
        bool flag=true;
        vis[sx][sy][sd]=1;
        id[sx][sy][sd]=1;
        cnt=-1;
        while(L)
        {
            int tv=move(sx,sy,sd);
            if(tv&&flag)
            {
                flag=false;
                L=L%(cnt-tv)+cnt-tv;
            }
            L--;
        }
        char ansd;
        if(sd==0)ansd='N';
        else if(sd==1)ansd='E';
        else if(sd==2)ansd='S';
        else ansd='W';
        printf("%d %d %c\n",sx,sy,ansd);
    }
    return 0;
}

F - c

Description

Problem Statement

We found a dictionary of the Ancient Civilization Mayo (ACM) during excavation of the ruins. After analysis of the dictionary, we revealed they used a language that had not more than 26 letters. So one of us mapped each letter to a different English alphabet and typed all the words in the dictionary into a computer.

How the words are ordered in the dictionary, especially whether they are ordered lexicographically, is an interesting topic to many people. As a good programmer, you are requested to write a program to judge whether we can consider the words to be sorted in a lexicographical order.

Note: In a lexicographical order, a word always precedes other words it is a prefix of. For example, ab precedes abcabde, and so on.

Input

The input consists of multiple datasets. Each dataset is formatted as follows:

nstring_1
...
string_n

Each dataset consists of n+1 lines. The first line of each dataset contains an integer that indicates n (1 \leq n \leq 500). The i-th line of the following n lines contains string_i, which consists of up to 10 English lowercase letters.

The end of the input is 0, and this should not be processed.

Output

Print either yes or no in a line for each dataset, in the order of the input. If all words in the dataset can be considered to be ordered lexicographically, print yes. Otherwise, print no.

Sample Input

4
cba
cab
b
a
3
bca
ab
a
5
abc
acb
b
c
c
5
abc
acb
c
b
b
0

Output for the Sample Input

yes
no
yes
no


两个串遇到不同的标记一下,然后传闭包,在判断一下;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int n,cnt;
string a,b;
int com[110][110];
void solve()
{
    int la,lb,ax,bx;
    bool flag=true;
    cin>>a;
    for(int i=2;i<=n;i++)
    {
        cin>>b;
        if(!flag)continue;
        la=a.size(),lb=b.size();
        ax=bx=0;
        while(ax<la&&bx<lb)
        {
            int p=a[ax]-'a'+1,q=b[bx]-'a'+1;
            if(p!=q)
            {
                com[p][q]=1;
                break;
            }
            ax++,bx++;
        }
        if(bx==lb&&la>lb){flag=false;}
        a=b;
    }
    for(int k=1;k<=30;k++)
        for(int i=1;i<=30;i++)
        for(int j=1;j<=30;j++)
        {
            if(i==j||com[i][j])continue;
            com[i][j]=(com[i][k]&com[k][j]);
        }
    for(int i=1;i<=30;i++)
    {
        for(int j=1;j<=30;j++)
        if(com[i][j]==1&&com[i][j]==com[j][i]){flag=false;break;}
        if(!flag)break;
    }
    if(flag)printf("yes\n");
    else printf("no\n");
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d",&n)!=EOF&&n)
    {
        memset(com,0,sizeof(com));
        solve();
    }
    return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值