問題へ[USACO07OCT]障害物コース&yzoj P1130コーナーソリューション

問題の意味

図は、N×Nが与えられると、Aが出発点であり、Bは、エンドポイントである、障害*に、屈曲-1の出力に到達することができない、ターン何度90度の最小値を尋ねる、歩くことができます。

解決

アイデア:構造N * M * 4点、各点は、元の画像は、4つのポイントに分割されている程度です。前記人物の方向における点は、(i、j、k)は時刻(i、j)を表し、kは、2つの点(i、j、k)とするための(I、J、K-K)、KおよびKKは2つである場合エネルギー変換は、90度の回転方向、及び側の偶数右端、及び(I、J、K)と(iは+ DX [k]は、J + 1 DY [K]、K)であっても、エッジ重みのためにkの方向に(i、j)はk個の到来方向のステップに行くことができる場合を示す側面に0は、(私はDX [k]は、J + DY [k]は、kは+)。不確実性の開始と終了の方向が、ソースSOおよびシンクポイントを追加し、右側の開始位置までのソース点が0の4辺方向に接続され、右側の4つの方向の終端位置に接続されたシンク次いで0側とシンクソースへの最短パスを見つけます。

バーストコード検索

#include<bits/stdc++.h>
using namespace std;
int n,sx,sy,ex,ey,a[110][110];
char k;
bool book[110][110];
int ans=1<<30;
bool cheak(int x,int y){
    if(x<1||y>n||y<1||x>n||a[x][y]||book[x][y]) return false;
    else return true;
}
void dfs(int x,int y,int dir,int step){
    if(x==ex&&y==ey){
        ans=min(step,ans);
        return;
    }
    if(step>ans) return;
    if(dir){
        if(cheak(x+1,y)){
            book[x+1][y]=1;
            dfs(x+1,y,dir,step);
            book[x+1][y]=0;
        }
        if(cheak(x-1,y)){
            book[x-1][y]=1;
            dfs(x-1,y,dir,step);
            book[x-1][y]=0;
        }
        if(cheak(x,y+1)){
            book[x][y+1]=1;
            dfs(x,y+1,0,step+1);
            book[x][y+1]=0;
        }
        if(cheak(x,y-1)){
            book[x][y-1]=1;
            dfs(x,y-1,0,step+1);
            book[x][y-1]=0;
        }
    }
    else{
        if(cheak(x+1,y)){
            book[x+1][y]=1;
            dfs(x+1,y,1,step+1);
            book[x+1][y]=0;
        }
        if(cheak(x-1,y)){
            book[x-1][y]=1;
            dfs(x-1,y,1,step+1);
            book[x-1][y]=0;
        }
        if(cheak(x,y+1)){
            book[x][y+1]=1;
            dfs(x,y+1,dir,step);
            book[x][y+1]=0;
        }
        if(cheak(x,y-1)){
            book[x][y-1]=1;
            dfs(x,y-1,0,step);
            book[x][y-1]=0;
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            scanf("%c",&k);
            if(k=='A'){
                sx=i;
                sy=j;
            }
            else if(k=='B'){
                ex=i;
                ey=j;
            }
            else if(k=='x'){
                a[i][j]=1;
            }
            else if(k=='.'){
                a[i][j]=0;
            }
            else j--;
        }
    }
    dfs(sx,sy,0,0);
    dfs(sx,sy,1,0);
    if(ans==1<<30) printf("-1");
    else printf("%d",ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/donkey2603089141/p/11416524.html