CF图论一--Statues--预处理+搜索

本文探讨了一种在棋盘上进行的游戏,其中玩家Maria试图在避开冰雕的同时到达对手Anna的位置。通过使用广度优先搜索算法,我们评估了在不同布局下Maria获胜的可能性。文章详细解释了游戏规则、算法实现及胜利条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C. Statues

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

In this task Anna and Maria play a game with a very unpleasant rival. Anna and Maria are in the opposite squares of a chessboard (8 × 8): Anna is in the upper right corner, and Maria is in the lower left one. Apart from them, the board has several statues. Each statue occupies exactly one square. A square that contains a statue cannot have anything or anyone — neither any other statues, nor Anna, nor Maria.

Anna is present on the board as a figurant (she stands still and never moves), and Maria has been actively involved in the game. Her goal is — to come to Anna's square. Maria and statues move in turn, Maria moves first. During one move Maria can go to any adjacent on the side or diagonal cell in which there is no statue, or she can stay in the cell where she is. The statues during their move must go one square down simultaneously, and those statues that were in the bottom row fall from the board and are no longer appeared.

At that moment, when one of the statues is in the cell in which the Maria is, the statues are declared winners. At the moment when Maria comes into the cell where Anna has been waiting, Maria is declared the winner.

Obviously, nothing depends on the statues, so it all depends on Maria. Determine who will win, if Maria does not make a strategic error.

Input

You are given the 8 strings whose length equals 8, describing the initial position on the board. The first line represents the top row of the board, the next one — for the second from the top, and so on, the last line represents the bottom row. Each character string matches a single cell board in the appropriate row, and the characters are in the same manner as that of the corresponding cell. If the cell is empty, the corresponding character is ".". If a cell has Maria, then it is represented by character "M". If a cell has Anna, it is represented by the character "A". If a cell has a statue, then the cell is represented by character "S".

It is guaranteed that the last character of the first row is always "A", the first character of the last line is always "M". The remaining characters are "." or "S".

Output

If Maria wins, print string "WIN". If the statues win, print string "LOSE".

Examples

input

Copy

.......A
........
........
........
........
........
........
M.......

output

Copy

WIN

input

Copy

.......A
........
........
........
........
........
SS......
M.......

output

Copy

LOSE

input

Copy

.......A
........
........
........
........
.S......
S.......
MS......

output

Copy

LOSE


一个冰雕会在一时刻下降一个位置,A可以向八个方向一时刻走一步。问到达B地方是否可行。
这个是借鉴的别人的思想,预处理出所有x,y点在某一时刻会有冰雕。在bfs的时候判断一下。那个

nex.step==mp[nex.x][nex.y][k]||nex.step+1==mp[nex.x][nex.y][k]

我认为是当前走的一步有冰雕、走了这一步后立马会有冰雕两种情况。

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct node
{
    int x,y,step;
} now,nex;
char a[10][10];
int vis[10][10];
vector<int>mp[10][10];
int fx[9]= {0,0,1,-1,0,1,1,-1,-1};
int fy[9]= {1,-1,0,0,0,1,-1,1,-1};
int n=8,m=8;
void Bfs(int sx,int sy)
{
    queue<node >s;
    now.x=sx;
    now.y=sy;
    s.push(now);
    memset(vis,0,sizeof(vis));
    vis[sx][sy]=1;
    while(!s.empty())
    {
        now=s.front();
        if(a[now.x][now.y]=='A')
        {
            printf("WIN\n");
            return ;
        }
        s.pop();
        for(int i=0; i<9; i++)
        {
            nex.x=now.x+fx[i];
            nex.y=now.y+fy[i];
            nex.step=now.step;
            if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m)
            {
                if(i!=4&&vis[nex.x][nex.y]==1)
                    continue;
                int flag=0;
                for(int k=0; k<mp[nex.x][nex.y].size(); k++)
                {
                    if(nex.step==mp[nex.x][nex.y][k]||nex.step+1==mp[nex.x][nex.y][k])
                        flag=1;//---这一步有冰雕、这一步后立马会有冰雕两种情况
                }
                if(flag==0)
                {
                    nex.step+=1;
                    s.push(nex);
                    vis[nex.x][nex.y]=1;
                }
            }
        }
    }
    printf("LOSE\n");
    return ;
}
int main()
{
    for(int i=0; i<8; i++)
    {
        scanf("%s",a[i]);
    }
    int sx,sy;
    for(int i=0; i<8; i++)
    {
        for(int j=0; j<8; j++)
        {
            if(a[i][j]=='M')
            {
                sx=i;
                sy=j;
            }
            if(a[i][j]=='S')
            {
                mp[i][j].push_back(0);
                for(int k=1; k<8; k++)
                {
                    int xx=i+k;
                    int y=j;
                    if(xx<8)
                    {
                        mp[xx][y].push_back(k);//xx,y位置在k时刻会有雕像
                    }
                }
            }
        }
    }
    Bfs(sx,sy);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值