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;
}

你可能感兴趣的:(C++,USACO)