POJ3009:Curling 2.0

题目描述

Curling 2.0
给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物也会随之消失,如果行动时超出方格的界限或行动次数超过了10则会game over .如果行动时经过3则会win,记下此时行动次数(不是行动的方格数),求最小的行动次数

题目思路

  • 会直接想到POJ1979:Red and Black
  • 依然是每次动一格,但是在0上动时不会dfs,而是一直向一个方向移动,直到碰到1,可以换方向了
  • 我前几次一直WA,后来发现是因为这道题行和列是反的…行和列是反的…行和列是反的…委屈QAQ

代码

#include <iostream>
#include<stdio.h>
using namespace std;
#define N 21
int board[N][N];
int minStep,step=0;
int direct[4][2]={
    {1,0},
    {-1,0},
    {0,1},
    {0,-1}
}; 
void dfs(int n,int m,int x,int y,int step){
    if(step>=10||step>minStep){
        return;
    }
    //cout<<"("<<x<<","<<y<<")"<<endl;
    for(int d=0;d<4;d++){
        int row=x;
        int col=y;
        while(row>=0&&row<n&&col>=0&&col<m){
            if(board[row][col]==1){
                if(!(row-direct[d][0]==x&&col-direct[d][1]==y)){
                    board[row][col]=0;
                    dfs(n,m,row-direct[d][0],col-direct[d][1],step+1);
                    board[row][col]=1;
                }
                row=-1;
            }else if(board[row][col]==0){
                row+=direct[d][0];
                col+=direct[d][1];
            }else if(board[row][col]==3){
                if(step+1<minStep){
                    minStep=step+1;
                }
                row=-1;
            }
            //cout<<"while"<<"("<<row<<","<<col<<")"<<endl;
        }
    }
}
int main() {
    freopen("in.txt","r",stdin);
    int n,m,sx,sy;
    while(1){
        cin>>m>>n;
        if(n==0&&m==0) break;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>board[i][j];
                if(board[i][j]==2){
                    sx=i;
                    sy=j;
                    board[i][j]=0;
                }
            }
        }
        minStep=11;
        dfs(n,m,sx,sy,0);
        if(minStep>10){
            minStep=-1;
        }
        cout<<minStep<<endl;
    }
    fclose(stdin);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/armstrong_rose/article/details/80425175