题目描述
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;
}