Find a way

Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki.
Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest.
Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes.

Input
The input contains multiple test cases.
Each test case include, first two integers n, m. (2<=n,m<=200).
Next n lines, each line included m character.
‘Y’ express yifenfei initial position.
‘M’    express Merceki initial position.
‘#’ forbid road;
‘.’ Road.
‘@’ KCF
Output
For each test case output the minimum total time that both yifenfei and Merceki to arrival one of KFC.You may sure there is always have a KFC that can let them meet.
Sample Input
4 4
Y.#@
....
.#..
@..M
4 4
Y.#@
....
.#..
@#.M
5 5
Y..@.
.#...
.#...
@..M.
#...#
Sample Output
66
88
66

这个题最开始的想法就是对分别对各个kfc的位置进行bfs,意料之中的TLE了,然而就看了一个博客,对每个位置都标记步数,然后对各个@位置求总步数的最小值,这个最小值如果初始化为0时,要把步数为0 的结果值去掉,原因1步数不可能为0 原因2为0要不表示没有路要不表示到不了这个地方,所以要去除为0的情矿


#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cmath>
#define maxx 210
using namespace std;

int n,m;
int book_y[maxx][maxx],book_m[maxx][maxx];
char ma[maxx][maxx];

struct note
{
    int x,y,step;
}st,ed;

void bfs_y()
{
    int i;
    int next[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
    queue<note>Q;
    Q.push(st);
    while(!Q.empty())
    {
        st=Q.front();
        Q.pop();
        for(i=0;i<4;i++)
        {
            ed.x=st.x+next[i][0];
            ed.y=st.y+next[i][1];
            if(book_y[ed.x][ed.y]==0&&(ma[ed.x][ed.y]=='.'||ma[ed.x][ed.y]=='@')&&ed.x>=0&&ed.y>=0&&ed.x<n&&ed.y<m)
            {
                ed.step=st.step+1;
                Q.push(ed);
                book_y[ed.x][ed.y]=ed.step;;
            }
        }
    }
}

void bfs_m()
{
    int i;
    int next[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
    queue<note>Q;
    Q.push(st);
    while(!Q.empty())
    {
        st=Q.front();
        Q.pop();
        for(i=0;i<4;i++)
        {
            ed.x=st.x+next[i][0];
            ed.y=st.y+next[i][1];
            if(book_m[ed.x][ed.y]==0&&ma[ed.x][ed.y]!='#'&&ed.x>=0&&ed.y>=0&&ed.x<n&&ed.y<m)
            {
                ed.step=st.step+1;
                Q.push(ed);
                book_m[ed.x][ed.y]=ed.step;;
            }
        }
    }
}

int main()
{
    char c;
    int i,j,yy,yx,mx,my;
    while(~scanf("%d %d",&n,&m))
    {
        memset(ma,0,sizeof(ma));
        for(i=0;i<n;i++)
        {
            getchar();
            for(j=0;j<m;j++)

            {
                scanf("%c",&c);
                ma[i][j]=c;
                if(c=='Y')
                {
                    yx=i;yy=j;
                }
                else if(c=='M')
                {
                    mx=i;my=j;
                }
            }
        }
        memset(book_y,0,sizeof(book_y));
        memset(book_m,0,sizeof(book_m));
        st.x=yx,st.y=yy,st.step=0;book_y[yx][yy]=1;
        bfs_y();
        st.x=mx,st.y=my,st.step=0;book_m[mx][my]=1;
        bfs_m();
        int ans=0x3f3f3f3f;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(ma[i][j]=='@'&&book_y[i][j]!=0&&book_m[i][j]!=0)
                {
                    ans=min(ans,book_y[i][j]+book_m[i][j]);
                }
            }
        }
        printf("%d\n",ans*11);
    }
    return 0;
}


这个代码再深入思考一下就应该考虑一个八两个代码合成一个代码,本来想着数组不一样不能合成,再翻了几个博客,发现直接步数相加就可以了

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cmath>
#define maxx 210
#define inf 0x3f3f3f3f
using namespace std;

int n,m;
int visit[maxx][maxx],book[maxx][maxx];
char ma[maxx][maxx];

struct note
{
    int x,y,step;
}st,ed;

void bfs(int num)
{
    int i;
    int next[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
    memset(visit,0,sizeof(visit));
    visit[st.x][st.y]=1;
    queue<note>Q;
    Q.push(st);
    while(!Q.empty())
    {
        st=Q.front();
        Q.pop();
        if(ma[st.x][st.y]=='@')
        {
            if(num==1)
            {
                book[st.x][st.y]=st.step;
            }
            else if(book[st.x][st.y]!=-1)
            {
                book[st.x][st.y]+=st.step;
            }
        }
        for(i=0;i<4;i++)
        {
            ed.x=st.x+next[i][0];
            ed.y=st.y+next[i][1];
            if(visit[ed.x][ed.y]==0&&ma[ed.x][ed.y]!='#'&&ed.x>=0&&ed.y>=0&&ed.x<n&&ed.y<m)
            {
                ed.step=st.step+1;
                Q.push(ed);
                visit[ed.x][ed.y]=1;
            }
        }
    }
}

int main()
{
    char c;
    int i,j,yy,yx,mx,my;
    while(~scanf("%d %d",&n,&m))
    {
        memset(ma,0,sizeof(ma));
        for(i=0;i<n;i++)
        {
            getchar();
            for(j=0;j<m;j++)

            {
                scanf("%c",&c);
                ma[i][j]=c;
                if(c=='Y')
                {
                    yx=i;yy=j;
                }
                else if(c=='M')
                {
                    mx=i;my=j;
                }
            }
        }
        memset(book,-1,sizeof(book));
        st.x=yx,st.y=yy,st.step=0;
        bfs(1);
        st.x=mx,st.y=my,st.step=0;
        bfs(2);
        int ans=inf;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(ma[i][j]=='@'&&book[i][j]!=-1&&visit[i][j]==1)//第一个标注Y一定路过,第二个表示第二个一定路过
                {
                    ans=min(ans,book[i][j]);
                }
            }
        }
        printf("%d\n",ans*11);
    }
    return 0;
}



<think>好的,用户想通过Sui Explorer和自定义RPC端点来追踪特定账户的取款交易,具体涉及两个地址。首先,我需要回忆Sui区块链的基本结构和交易追踪的方法。Sui Explorer是官方工具,通常用于查看交易、地址和对象等信息,但用户提到要连接自定义RPC,这可能意味着需要配置Explorer使用自己的节点。 接下来,用户提到了两个地址,0xb88...和package地址0x253...。需要确定这两个地址在交易中的角色。前者可能是一个账户地址,后者可能是一个智能合约的包地址。取款交易通常涉及调用合约的函数,所以可能需要检查与该合约交互的交易。 第一步,用户可能需要配置Sui Explorer连接到自定义RPC。我记得Sui Explorer允许设置自定义RPC端点,通常在设置或网络选项中修改。用户需要确保他们的节点已经正确运行,并且RPC端口开放。 然后,如何追踪特定地址的交易。在Sui Explorer中,可以通过地址页面查看所有相关交易。输入地址0xb88...,查看其交易历史,特别是涉及package 0x253...的交易。可能需要筛选交易类型,比如查找函数调用,尤其是取款操作。 另外,Sui的交易结构基于Move语言,每个交易会有发送者、接收者、调用的函数和参数。用户需要找到从0xb88...发起的,调用suinado_cash包中withdraw函数的交易。可能需要检查交易的事件或对象变化,比如代币转移。 如果通过Explorer无法满足需求,可能需要使用Sui CLI或直接查询RPC。比如,使用sui client transactions命令列出地址的所有交易,再用sui client tx-block查看详细信息。或者编写脚本调用RPC的suix_queryTransactions方法,过滤sender和函数参数。 另外,用户可能需要关注Move调用中的参数,检查输入和输出对象的变化。比如,取款操作可能会导致某个代币对象从合约转移到用户地址,通过跟踪对象的Owner字段变化可以确认。 需要注意的是,Sui的数据模型基于对象,每个交易会修改对象的状态。因此,取款交易应该涉及到某个Coin对象的转移,从合约持有变为用户持有。可以通过查询该用户地址下的Coin对象历史记录来追踪。 最后,用户可能需要组合多个方法:先通过Explorer大致定位,再用CLI或自定义脚本深入分析。同时,确保自定义RPC节点同步到最新的区块,以获取准确的交易数据。</think>要追踪特定账户在Sui区块链上的取款交易,可通过以下步骤结合Sui Explorer和自定义RPC实现: ### 1. **配置自定义RPC节点** 在Sui Explorer右上角选择「齿轮图标」→「Network」→「Custom RPC」,输入您的节点URL(格式:`http://[IP]:9000`)。确保节点已同步到最新区块高度[^1]。 ### 2. **地址交易追踪** 在Sui Explorer搜索栏输入地址: `0xb88bb374a09305864032ffdcc9a15a2e1a0cd9d55b239d5158ac7e426487b0cb` 重点关注: - **Move调用过滤**:筛选`Package ID: 0x253899d91a9d03d34e47368a251140634fc9cf89ade188e2f1016f5ce9102344` - **事件类型**:查找`WithdrawEvent`或类似自定义事件 ### 3. **CLI高级查询(可选)** ```bash # 查询地址所有交易 sui client transactions --address 0xb88bb374a09305864032ffdcc9a15a2e1a0cd9d55b239d5158ac7e426487b0cb # 解析具体交易 sui client tx-block --show-balance-changes [DIGEST] ``` ### 4. **RPC直接调用** 使用`suix_queryTransactions`方法过滤: ```json { "filter": { "FromAndToAddress": { "from": "0xb88bb374...", "to": "0x253899d9..." } }, "options": { "showInput": true, "showEffects": true } } ``` ### 5. **Move合约分析** 检查package`0x253899d9...`的源码,确认取款函数的标识符,例如: $$ \text{function withdraw}(Coin<T>, \text{address}) $$ 通过交易输入参数中的`arguments`字段验证资金流向[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值