• 【USACO 2.4】The Tamworth Two


    题意:C代表cows,F代表farmer,一开始都向北,每分钟前进1步,如果前方不能走,则这分钟顺时针转90°,问多少步能相遇,或者是否不可能相遇,10*10的地图。

    题解:dfs,记录状态,C和F的位置各一维,C和F的方向各一维,所以vis[101][101][5][5]记录是否到过这个状态。

    /*
    TASK: ttwo
    LANG: C++
    */
    #include<cstdio>
    #include<iostream>
    char m[11][11];
    int vis[101][101][5][5];
    int dx[5]={-1,0,1,0},dy[5]={0,1,0,-1};
    int ans;
    bool ck(int x,int y){
        return x>=0&&x<10&&y>=0&&y<10&&m[x][y]!='*';
    }
    bool dfs(int fx,int fy,int df,int cx,int cy,int dc){
       // printf("f=(%d %d) %d c=(%d %d) %d
    ",fx,fy,df,cx,cy,dc);
        int ff=fx*10+fy,cc=cx*10+cy;
        if(vis[ff][cc][df][dc])return 0;
        vis[ff][cc][df][dc]=1;
        if(ff==cc)
            return 1;
        ans++;
        int nfx=fx+dx[df],nfy=fy+dy[df],ncx=cx+dx[dc],ncy=cy+dy[dc];
        if(!ck(nfx,nfy)){
            df=(df+1)%4;
            nfx=fx;
            nfy=fy;
        }
        if(!ck(ncx,ncy)){
            dc=(dc+1)%4;
            ncx=cx;
            ncy=cy;
        }
        if(dfs(nfx,nfy,df,ncx,ncy,dc))return 1;
        ans--;
        return 0;
    }
    int main(){
        freopen("ttwo.in","r",stdin);
        freopen("ttwo.out","w",stdout);
        int cx,cy,fx,fy;
        for(int i=0;i<10;i++){
            scanf("%s",m[i]);
            for(int j=0;m[i][j];j++)
                if(m[i][j]=='C'){
                    cx=i;
                    cy=j;
                }else if(m[i][j]=='F'){
                    fx=i;
                    fy=j;
                }
        }
        if(dfs(fx,fy,0,cx,cy,0)){
            printf("%d
    ",ans);
        }else{
            puts("0");
        }
        return 0;
    }
    

      

  • 相关阅读:
    桶排序
    Ultra-QuickSort
    Merge Sort
    Max Sum
    快排
    Oil Deposits
    1009: josephus问题
    A+B Again(在某个数中找大于m的最小约数)
    luogu4181 [USACO18JAN]Rental Service (贪心)
    luogu4185 [USACO18JAN]MooTube (并查集)
  • 原文地址:https://www.cnblogs.com/flipped/p/6048210.html
Copyright © 2020-2023  润新知