有一个愚蠢的机器人走进一个w*h的迷宫,迷宫里有空地和陷阱。他想要访问迷宫的每个方格,但是它很笨,只会按照指令的方向走。当机器人不能走的时候,也就是下一步会遇到陷阱、迷宫边界或者访问过的格子,它会向右转90度(顺时针旋转90度,不能访问已经访问过的方格,且在原地只转一次,移动后可获得又一次旋转机会)。请问这个机器人最多可以经过多少个方格。
输入
对于每组数据,第一行两个数w和h,表示迷宫的行和列(1<=w,h<=10)
接下来w行每行有h个字符用于描述这个迷宫。迷宫的‘.’表示空地,即为可以走的地方。‘*’表示陷阱,即为不能走的地方。迷宫中有一个英文字母,表示机器人的出发点,字母只有’U’,’D’,’L’,’R’四种。分别表示机器人的初始指令是向上,向下,向左,向右。
输出
对于每组数据,输出一个整数,即机器人一共经过多少个方格。
样例输入
2 3
U..
.*.
4 4
R...
.**.
.**.
....
样例输出
4
12
我的思路:
vis记录是否访问过,flag代表转了几次
#include <stdio.h>
#include <stdlib.h>
#include "iostream"
using namespace std;
int main(){
int w,h;
while(scanf("%d%d",&w,&h)==2){
char **a=new char*[w];
int **vis=new int*[w];
for (int i=0;i<w;i++){
a[i]=new char[h];
vis[i]=new int[h];
}
for (int i=0;i<w;i++)
scanf("%s",a[i]);
int sx,sy;
char z,t;
for (int i=0;i<w;i++){
for (int j=0;j<h;j++){
vis[i][j]=0;
z=a[i][j];
if(z=='U'||z=='L'||z=='R'||z=='D'){
sx=i;
sy=j;
t=z;
}
}
}
int flag=0,ge=1,d;
if(t=='U')代码:
import hashlib
import datetime
for n in range(3,11):
starttime = datetime.datetime.now()
pre=""
i=0
res=''
while(pre!='0'*n):
i+=1
res=str(hashlib.sha256(("zhengzhaozuo"+str(i)).encode('utf-8')).hexdigest())
pre=res[0:n]
print("i: ",str(i)," str:",res)
endtime = datetime.datetime.now()
print("时间:",(endtime - starttime).seconds,"s")
d=0;
if(t=='L')
d=3;
if(t=='R')
d=1;
if(t=='D')
d=2;
vis[sx][sy]=1;
while(flag!=2){
if(d==0)
{
//cout<<"U";
if(sx==0||vis[sx-1][sy]==1||a[sx-1][sy]=='*')
{
flag++;
d=1;
continue;
}
ge++;
flag=0;
sx--;
vis[sx][sy]=1;
}
else if(d==1){
//cout<<"T";
if(sy==h-1||vis[sx][sy+1]==1||a[sx][sy+1]=='*')
{
flag++;
d=2;
continue;
}
ge++;
flag=0;
sy++;
vis[sx][sy]=1;
}else if(d==2){
//cout<<"F";
if(sx==w-1||vis[sx+1][sy]==1||a[sx+1][sy]=='*')
{
flag++;
d=3;
continue;
}
ge++;
flag=0;
sx++;
vis[sx][sy]=1;
}else if(d==3){
// cout<<"G";
if(sy==0||vis[sx][sy-1]==1||a[sx][sy-1]=='*')
{
flag++;
d=0;
continue;
}
ge++;
flag=0;
sy--;
vis[sx][sy]=1;
}
}
cout<<ge;
}
return 0;
}