USACO section2.4 The Tamworth Two题解&代码

很简单的模拟…需要避免产生循环的情况,所以设置vis数组记录step
但是需要注意的是使用scanf(“%c”,&m[i][j])的话scanf会等到遇到第一个非可读字符的时候结束…
这样的话j就不是准确的了…
恩…看了15min才看出来…果然是该去休息了…

/*
ID:rainbow16
LANG:C++
TASK:ttwo
*/
#include<stdio.h>
char m[10][10];
bool vis[10][10][4][10][10][4];
int cx,cy,cf,fx,fy,ff;
void dfs(int t)
{
    if(cx==fx && cy==fy)
    {
        printf("%d\n",t);
        return;
    }
    if(vis[cx][cy][cf][fx][fy][ff])
    {
        printf("0\n");
        return;
    }
    vis[cx][cy][cf][fx][fy][ff]=1;
    switch(cf)
    {
        case 0:
            if(cx==0 || m[cx-1][cy]=='*')
                cf++;
            else
                cx--;
            break;
        case 1:
            if(cy==9 || m[cx][cy+1]=='*')
                cf++;
            else
                cy++;
            break;
        case 2:
            if(cx==9 || m[cx+1][cy]=='*')
                cf++;
            else
                cx++;
            break;
        case 3:
            if(cy==0 || m[cx][cy-1]=='*')
                cf=0;
            else
                cy--;
            break;
    }
    switch(ff)
    {
        case 0:
            if(fx==0 || m[fx-1][fy]=='*')
                ff++;
            else
                fx--;
            break;
        case 1:
            if(fy==9 || m[fx][fy+1]=='*')
                ff++;
            else
                fy++;
            break;
        case 2:
            if(fx==9 || m[fx+1][fy]=='*')
                ff++;
            else
                fx++;
            break;
        case 3:
            if(fy==0 || m[fx][fy-1]=='*')
                ff=0;
            else
                fy--;
            break;
    }
    dfs(t+1);
}
int main(void)
{
    freopen("ttwo.in","r",stdin);
    freopen("ttwo.out","w",stdout);
    for(int i=0;i<10;i++)
    {
        scanf("%s",&m[i]);
        for(int j=0;j<10;j++)
        {
            if(m[i][j]=='C')
            {
                cx=i;
                cy=j;
                cf=0;
                m[i][j]='.';
            }
            if(m[i][j]=='F')
            {
                fx=i;
                fy=j;
                ff=0;
                m[i][j]='.';
            }
        }
    }
    dfs(0);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值