有一次问老师,老师给的结果是贪心(???)
他说:yee,你可以试一下让小H不要急着回家要保命才对(就是尽量别死,能去捡鼠标就捡),不然的话躺在地上很容易被看看的(好艹啊)
...结果就是因为老师华丽的嘴唇吐字不清(5%)+我极度somebody(5%)+不会(20%)+懒(70%),导致我没有用贪心(用的应该算深搜吧!233,没超时,却只输出-1)
代码如下
#include<bits/stdc++.h>
using namespace std;
int cin_n,cin_m,a[10][10],hp=6,ans,n1,m1,n2,m2,minn,f;
//cin_n和cin_m矩阵长和宽,a数组读入,hp血量,ans走的步数,
//n1,m1,n2,m2:起始点和家门口,minn求最少步数,f判断死亡,
//b数组判断格子是否走过
bool b[10][10];
void Search(int x,int y)
{
if(hp==0)//是否死亡
{
f=0;
return;
}
++ans;//走一步
if(x==m2&&y==n2&&hp!=0)//是否到达终点
{
f=1;
if(ans<minn)minn=ans;
}
else
{
b[x][y]=1;//标记为走过
if(!b[x+1][y]&&x<m2&&a[x+1][y]!=0&&hp!=0)//左
{
if(a[x+1][y]==4)//吃药
hp=6;
hp--;//减少血量
if(hp==0)//是否死亡
{
f=0;
return;
}
Search(x+1,y);
}
if(!b[x][y+1]&&y<n2&&a[x][y+1]!=0&&hp!=0)//下
{
if(a[x][y+1]==4)//同上
hp=6;
hp--;
if(hp==0)
{
f=0;
return;
}
Search(x,y+1);
}
if(!b[x-1][y]&&x>0&&a[x-1][y]!=0&&hp!=0)//右
{
if(a[x-1][y]==4)
hp=6;
hp--;
if(hp==0)
{
f=0;
return;
}
Search(x-1,y);
}
if(!b[x][y-1]&&y>0&&a[x][y-1]!=0&&hp!=0)//上
{
if(a[x][y-1]==4)
hp=6;
hp--;
if(hp==0)
{
f=0;
return;
}
Search(x,y-1);
}
--ans;
b[x][y]=0;
}
}
int main()
{
cin>>cin_n>>cin_m;
for(int i=1;i<=cin_n;i++)
for(int j=1;j<=cin_m;j++)
{
cin>>a[i][j];
if(a[i][j]==2)//找起始点
{
n1=i;
m1=j;
}
if(a[i][j]==3)//找结束点
{
n2=i;
m2=j;
}
}
f=0;
ans=0;
minn=cin_n*cin_m;//假设是走遍全图
Search(n1,m1);
if(f==0)cout<<-1;
else cout<<minn;
return 0;
}
有人能帮帮吗??????
或看看老师的想法是否可行??????
(他很年轻的,所以应该很菜吧233333)
(在灌水区有个大佬说了,老师太菜了,所以他的想法是错的233333)