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 =西
- ドクター= 6 = D
- タルディス= 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人の天使がDoctorを監視している場合、これらからの戻り値は「AND」されるため、テスト例では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例:FNSSSWNNNWSSSWSSSSENNESES
2例:出口なし
VisualMelonの例:FNSSSSSSSWNNNNNNNWSSSSSSSSSEEEEEE
私のテストケース1:FSSENEEEFWSSFNSWWN
私のテストケース2:FSEEEESFWSSSSFNWWWWNFENNFSEES
ご覧のように、私の医師は、天使たちに動き回ることの楽しさを示すために、潅水のように歩き回るのが大好きです。ソフトウェアに最短経路を見つけさせることはできますが、時間がかかり、より多くのコードが必要です。
あなたのためのテストケース
S
D....
..NE.
.WTS.
.S...
別のもの:
E
D....
WNNN.
...E.
.WTE.
.SSE.
.....