这道题虐我一百遍
真的是难受
Curling 2.0
本来想学个直线搜索和回溯的,结果他妈的代码,疯狂搞我。
坑点:
1.输入时先列后行
2.冰壶碰撞之后石头会碎掉
3.冰壶停在石头的前一个位置
//#include<bits/stdc++.h>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int arr[25][25];
int stX,stY,ans;
int m,n;
int dx[4] = {1,0,-1,0};
int dy[4]= {0,1,0,-1};
void dfs(int x, int y, int step){ //坐标与步数
if(step >=10|| step >= ans) return;
int xx,yy;
int flag;
for(int i=0;i<4;i++){ //四个方向搜索
if(arr[x+dx[i]][y+dy[i]] == 1) continue; //相邻是石头,直接略过该方向
flag=0;
xx =x;
yy = y;
while(1){ //直线搜索
xx=xx+dx[i];
yy=yy+dy[i];
if(xx<0||xx>=m||yy<0||yy>=n){flag=1;break;} //越界,做标记并退出
if(arr[xx][yy]==0) continue; //畅通直行
if(arr[xx][yy]==1) break; //遇到石头停止
if(arr[xx][yy]==3) {ans = step + 1;return;} //找到目标,直接返回
}
if(flag) continue; //越界则跳过该方向
arr[xx][yy]=0; //未越界,则碰到了石头停下来,石头被撞碎了,变为0
dfs(xx-dx[i],yy-dy[i],step+1); //冰壶停在石头的上一个位置,继续搜索
arr[xx][yy]=1; //回溯,假设没有进行这个方向,石头没被撞碎。
}
}
int main(){
while(scanf("%d%d",&n,&m)){ //输入搞我!!先列后行
if(m==0&&n==0) break;
memset(arr,0,sizeof(arr));
ans=11; //默认没有成功过,步数大于10
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
scanf("%d",&arr[i][j]);
if(arr[i][j]==2){
stX=i;
stY=j;
}
}
dfs(stX,stY,0);
if(ans > 10){
printf("-1\n");
}else
printf("%d\n",ans);
}
return 0;
}