C#1454、1396、1373、1303 1279
class P{static int x,d,y=x=d=55,o=170,X=0,Y=0,u,k=3;static string[,]t=new string[o,o];static int[,]m=new int[o,o];static string e=" NS ETD W .",q="0";static void Main(string[]s){m[0,1]=m[1,8]=-1;m[0,2]=m[1,4]=1;u=e.IndexOf(s[0][0]);for(;k<s[0].Length;k++){var c=s[0][k];if(c=='D'){X=x;Y=y;}if(c=='\\'){y++;x=d;k++;}else m[y,x++]=e.IndexOf(c);}k=A(X,Y,1);if((k&u)!=0){W(X,Y,k,"");}System.Console.Write(q);}static void W(int x,int y,int h,string s){t[y,x]=s;for(int i=1;i<9;i*=2){int l=y+m[0,i],g=x+m[1,i];if(m[l,g]==5)q=t[l,g]=s+e[i];else if(m[l,g]==15){m[l,g]=6;m[y,x]=15;int n=A(g,l,1),U;for(int j=1;j<9;j*=2){var z=t[l,g]??s;if((n&h&j)!=0&z.Length>=s.Length){U=u;u=j;W(g,l,n,s+((u!=j)?"F"+e[j]:"")+e[i]);u=U;}}m[y,x]=6;m[l,g]=0;}}}static int A(int x,int y,int L){int r=15,a,b,c,f=0,g,h,R,B;for(a=1;a<d-5;a++){g=1;for(b=y-a;b<=y+a;b++)for(c=x-a;c<=x+a;c++){B=m[b,c];R=0;bool W=(c+a-x)%a==0,V=(b+a-y)%a==0,z=W&V;if(B>0&B<9&B!=6&B!=5&g!=16&!((W|V)&(f&g)!=0)){h=R;if(b==y-a){R=1;if(c==x-a){h=4;R=9;}else if(c==x+a){h=8;R=5;}B&=h&2;}else if(b==y+a){R=2;if(c==x-a){h=4;R=10;}else if(c==x+a){h=8;R=6;}B&=h&1;}else if(c==x-a){B&=4;R=8;}else if(c==x+a){B&=8;R=4;}else B=0;if(B!=0){if(L==1&&A(c,b,0)==15)r&=R;if(L==0)return R;}}if(z){if(B<9&B>0&!(c==x&y==b))f|=g;g*=2;}}}return r;}}
对。所以我决定试一试,男孩花了一段时间。它主要使用逻辑运算符构建。
- 北= 1 = N
- 南= 2 = S
- 东= 4 = E
- 西= 8 = W
- 医生= 6 = D
- TARDIS = 5 = T
- 15 =。<-所有可用空间
为了避免检查是否为Null等。我决定使用[MAX_SIZE * 3] * [MAX_SIZE] * 3字段,并将游戏板放置在中央附近。
循环检查从内到外一直进行到50(MAX_SIZE)。所以像这样:
22222
21112
21D12
21112
22222
当找到EWS或N时,我会对它们进行相同的检查。如果发现有人在看天使(不是医生),他们将免费退还15。如果不注意他们,医生将以哪种方式返回以确保安全。即N将向南返回2。除非是NW或NE,否则它将分别返回6(2 + 4)和10(2 + 8)。
如果两个天使在看医生,则返回的值将为“与”,因此在测试示例2中,关键位置4和8将变为0。这意味着该位置不好,应该避免。
扩展代码:
class P
{
static int x,d,y=x=d=55,o=170,X=0,Y=0,u,k=3;
static string[,] t = new string[o, o];
static int[,] m = new int[o, o];
static string e = " NS ETD W .", q="0";
static void Main(string[]s)
{
m[0, 1]=m[1, 8]=-1;
m[0, 2]=m[1, 4]=1;
u=e.IndexOf(s[0][0]);
for (;k<s[0].Length;k++)
{
var c = s[0][k];
if (c == 'D') { X = x; Y = y; }
if (c == '\\') { y++; x = d; k++; }
else m[y, x++] = e.IndexOf(c);
}
k=A(X,Y,1);
if ((k&u)!=0)
{
W(X, Y, k,"");
}
System.Console.Write(q);
}
static void W(int x,int y,int h,string s){
t[y, x] = s;
for (int i = 1; i < 9; i*=2)
{
int l = y+m[0, i], g = x+m[1, i];
if (m[l, g] == 5)
q = t[l, g] = s + e[i];
else if (m[l, g] == 15)
{
m[l, g] = 6;
m[y, x] = 15;
int n = A(g, l,1),U;
for (int j = 1; j < 9; j *= 2)
{
var z = t[l, g]??s;
if ((n & h & j) != 0 & z.Length>=s.Length)
{
U = u;
u = j;
W(g, l, n,s+((u != j) ? "F" + e[j] : "") + e[i]);
u = U;
}
}
m[y, x] = 6;
m[l, g] = 0;
}
}
}
static int A(int x, int y,int L)
{
int r = 15,a,b,c,f=0,g,h,R,B;
for (a = 1; a < d - 5; a++)
{
g = 1;
for (b = y - a; b <= y + a; b++)
for (c = x - a; c <= x + a; c++)
{
B=m[b, c];
R=0;
bool W=(c+a-x)%a==0,V=(b+a-y)%a==0,z=W&V;
if (B>0&B<9&B!=6&B!=5&g!=16&!((W|V)&(f&g)!=0))
{
h=R;
if (b==y-a)
{
R=1;
if(c==x-a){h=4;R=9;}
else if(c==x+a){h=8;R=5;}
B&=h&2;
}
else if (b==y+a)
{
R=2;
if(c==x-a){h=4;R=10;}
else if (c==x+a){h=8;R=6;}
B&=h&1;
}
else if(c==x-a){B&=4;R=8;}
else if(c==x+a){B&=8;R=4;}
else B=0;
if (B!=0)
{
if(L==1&&A(c,b,0)==15)r&=R;
if (L==0)return R;
}
}
if (z)
{
if (B < 9 & B > 0 & !(c==x&y==b))
f |= g;
g *= 2;
}
}
}
return r;
}
}
检测结果
1范例:FNSSSWNNNWSSSWSSSSSENSES
2示例:无路可走
VisualMelon示例:FNSSSSSSSWNNNNNNNWSSSSSSSSSEEEE
我的测试案例1:FSSENEEEFWSSFNSWWN
我的测试案例2:FSEEEESFWSSSSFNWWWWNFENNFSEES
可以看出,我的医生喜欢像冲洗一样四处张望,向天使们展示四处走动的乐趣。我可以使软件找到最短的路径,但是它需要更长的时间,并且需要更多的代码。
你们的测试用例
S
D....
..NE.
.WTS.
.S...
另一个:
E
D....
WNNN.
...E.
.WTE.
.SSE.
.....