กองทัพอยู่ร่วมกันอย่างสงบสุข


15

ในเกมหมากรุกมีชิ้นส่วนที่เรียกว่าราชินีที่อาจโจมตีชิ้นอื่น ๆ ที่อยู่ในแถวเดียวกันคอลัมน์หรือแนวทแยง ในหมากรุกโดยทั่วไปจะมีสองด้านคือขาวดำโดยแต่ละชิ้นเป็นของหนึ่งในทีม ชิ้นอาจไม่โจมตีชิ้นส่วนที่เป็นของทีมเดียวกัน

เป้าหมายของคุณคือค้นหากองทัพที่อยู่ร่วมกันได้อย่างสงบสุขที่สุดสำหรับกระดานสี่เหลี่ยม นั่นคือจำนวนของควีนส์ขาวและดำที่ใหญ่ที่สุดที่สามารถใส่ลงบนกระดานได้ดังนั้นไม่มีควีนส์สองคนที่สามารถโจมตีซึ่งกันและกันและจำนวนของควีนส์ดำนั้นเท่ากับจำนวนควีนไวท์

คุณจะได้รับข้อมูลป้อนเข้าตามความยาวด้านของกระดานสี่เหลี่ยมและควรส่งออกจำนวนขนาดของกองทัพที่อยู่ร่วมกันได้อย่างสันติที่ใหญ่ที่สุดที่สามารถบรรจุลงบนกระดานได้

นี่คือเพื่อใช้กฎมาตรฐานสำหรับแท็ก

OEIS A250000

กรณีทดสอบเหล่านี้รวมคำตอบที่รู้จักทั้งหมด โซลูชันของคุณควรเป็นคำตอบทั่วไปที่ให้พลังงานและเวลาในการคำนวณเพียงพอสามารถคำนวณโซลูชันสำหรับค่าอินพุตใด ๆ

1: 0
2: 0
3: 1
4: 2
5: 4
6: 5
7: 7
8: 9
9: 12
10: 14
11: 17
12: 21
13: 24

จากการอ่านลิงก์ OEIS ฉันไม่แน่ใจว่ามีคำตอบที่รู้จักกันดีเกี่ยวกับความยาวด้านโดยพลการ
Kelly Lowder

5
@ KellyLowder คุณสามารถดุร้ายได้ตลอดเวลา!
musicman523

2
@ musicman523, lol บางอย่างเช่น 3 ^ (6 ^ 2) หรือ 10 ^ 17 สถานะที่เป็นไปได้สำหรับบอร์ด 6x6
Kelly Lowder

5
@KellyLowder ฉันไม่ได้บอกว่ามันจะเร็ว: P
musicman523

การตัดจะเร็วขึ้น
CalculatorFeline

คำตอบ:


8

C, 476 ไบต์, DFS วนซ้ำ White queens, O (2 n 2 )

#define R return
#define Z(q)for(j=q;j<I;j++)
#define Q(q)memset(q,0,4*J);
#define U(q)S(w[k]/I q j,w[k]%I+j)
int*c,*w,*Y,j,k,r,I,J,m;T(i,j){R i*I+j;}S(x,y){x>=0&&x<I&&y>=0&&y<I?Y[T(x,y)]=1:0;}g(l){int i;if(l==m){Q(Y)for(k=m;k--;){Z(0)Y[T(w[k]/I,j)]=Y[T(j,w[k]%I)]=1;Z(-I)U(+),U(-);}for(r=k=J;k--;)r-=Y[k];R r>=m;}for(i=!l?0:w[l-1]+1;i<J;i++){if(!c[i]){c[i]=1;w[l]=i;if(g(l+1))R 1;c[i]=0;}}R 0;}f(s){I=s;J=I*I;int C[J],W[J],y[J];c=C;w=W;Y=y;for(m=1;;m++){Q(c)if(!g(0))R m-1;}}

518 ไบต์, DFS พร้อมการตัดแต่ง, O (2 n )

#define R return
#define Z(q)for(j=q;j<I;j++)
#define Q(q)memset(q,0,4*J);
#define V(Q)t=Q;if(!Y[t]){G-=Y[t]=1;b[B++]=t;}
#define F(q)if(S(x q j,y+j)){V((x q j)*I+y+j)}
int*c,*w,*Y,j,k,r,I,J,m;S(x,y){R x>=0&&x<I&&y>=0&&y<I;}D(l,H){int i,b[J],B,t,x,y,G;if(l==m)R 1;for(i=!l?0:w[l-1]+1;i<J;i++){if(!c[i]){c[i]=1;w[l]=i;x=i/I;y=i%I;G=H;Z(B=0){V(x*I+j)V(j*I+y)}Z(-I){F(+)F(-)}if(G>=m&&D(l+1,G))R 1;for(j=B;j--;)Y[b[j]]=0;c[i]=0;}}R 0;}f(s){I=s;J=I*I;int C[J],W[J],y[J];c=C;w=W;Y=y;for(m=1;;m++){Q(c)Q(Y)if(!D(0,J))R m-1;}}

577 ไบต์, DFS วนซ้ำขาวและดำ, O (?)

#define R return
#define U(V,r,q)S(V,r[i]/I q j,r[i]%I+j)
#define W(q)for(j=q;j<I;j++)
#define Z(r,q,t,v)for(i=0;i<r;i++){t[q[i]]=1;W(0)v[T(q[i]/I,j)]=v[T(j,q[i]%I)]=1;W(-I)U(v,q,+),U(v,q,-);};
#define P(K,L,M)memcpy(v,K,4*J);for(i=0;i<J;i++)if(!v[i]){L[M++]=i;if(g(E,N,!C))R 1;M--;};
int*w,*b,m,I,J;T(i,j){R i*I+j;}Q(int*q){memset(q,0,4*J);}S(V,x,y)int*V;{x>=0&&x<I&&y>=0&&y<I?V[T(x,y)]=1:0;}g(E,N,C){int i,j,v[J],X[J],Y[J];if(E==m&&N==m)R 1;Q(X);Q(Y);Z(E,w,X,Y)Z(N,b,Y,X)if(C){P(Y,b,N)}else{P(X,w,E)}R 0;}f(q){I=q,J=I*I;int W[J],B[J];w=W,b=B;for(m=1;;m++)if(!g(0,0,0))R m-1;}

โดยทั่วไปรหัสจะวนซ้ำไปที่ความเป็นไปได้ของราชินีขาวและตรวจสอบว่าราชินีสีดำนั้นสามารถวางได้

ตารางอ้างอิงความเร็ว (เป็นวินาที):

+---+----------------------+---------------------+-----------------+--------+
| n |      DFS w & b       |        DFS w        |  DFS w/ pruning | Clingo |
+---+----------------------+---------------------+-----------------+--------+
| 3 |                 0.00 |                0.00 |            0.00 |   0.01 |
| 4 |                 0.00 |                0.00 |            0.00 |   0.02 |
| 5 |                 0.47 |                0.16 |            0.00 |   0.04 |
| 6 |                20.62 |                1.14 |            0.00 |   0.60 |
| 7 |              1125.07 |              397.88 |            0.63 |  18.14 |
| 8 |                      |                     |            1.28 | 979.35 |
| 9 |                      |                     |           23.13 |        |
+---+----------------------+---------------------+-----------------+--------+

2

Clingo , 90 ไบต์

{q(1..n,1..n)}.a(X+(-I;0;I),Y+(0;I)):-q(X,Y),I=-n..n.:~K={q(X,Y)},{a(1..n,1..n)}n*n-K.[-K]

การสาธิต

$ clingo peaceable.lp -cn=6
clingo version 5.1.0
Reading from peaceable.lp
Solving...
Answer: 1

Optimization: 0
Answer: 2
q(6,1) a(7,1) a(7,2) a(8,1) a(8,3) a(9,1) a(9,4) a(10,1) a(10,5) a(11,1) a(11,6) a(12,1) a(6,1) a(6,2) a(6,3) a(6,4) a(6,5) a(6,6) a(5,1) a(5,2) a(4,1) a(4,3) a(3,1) a(3,4) a(2,1) a(2,5) a(1,1) a(1,6) a(0,1) a(7,0) a(8,-1) a(9,-2) a(10,-3) a(11,-4) a(12,-5) a(6,-4) a(6,-3) a(6,-2) a(6,-1) a(6,0) a(5,0) a(4,-1) a(0,7) a(1,-4) a(2,-3) a(3,-2) a(6,-5) a(6,7) a(0,-5) a(12,7)
Optimization: -1
Answer: 3
q(1,6) q(6,1) a(7,1) a(7,2) a(7,6) a(8,1) a(8,3) a(9,1) a(9,4) a(10,1) a(10,5) a(11,1) a(11,6) a(12,1) a(6,1) a(6,2) a(6,3) a(6,4) a(6,5) a(6,6) a(5,1) a(5,2) a(5,6) a(4,1) a(4,3) a(4,6) a(3,1) a(3,4) a(3,6) a(2,1) a(2,5) a(2,6) a(1,1) a(1,2) a(1,3) a(1,4) a(1,5) a(1,6) a(0,1) a(0,5) a(0,6) a(-1,4) a(-1,6) a(-2,3) a(-2,6) a(-3,2) a(-3,6) a(-4,1) a(-4,6) a(-5,6) a(7,0) a(8,-1) a(9,-2) a(10,-3) a(11,-4) a(12,-5) a(6,-4) a(6,-3) a(6,-2) a(6,-1) a(6,0) a(5,0) a(4,-1) a(0,7) a(1,7) a(2,7) a(-1,8) a(1,8) a(3,8) a(-2,9) a(1,9) a(-3,10) a(1,10) a(-4,11) a(1,11) a(-5,12) a(1,-4) a(1,0) a(2,-3) a(3,-2) a(6,-5) a(6,7) a(4,9) a(5,10) a(6,11) a(1,12) a(-5,0) a(0,-5) a(7,12) a(12,7)
Optimization: -2
Answer: 4
q(1,6) q(6,1) q(6,6) a(7,1) a(7,2) a(7,5) a(7,6) a(8,1) a(8,3) a(8,4) a(8,6) a(9,1) a(9,3) a(9,4) a(9,6) a(10,1) a(10,2) a(10,5) a(10,6) a(11,1) a(11,6) a(12,1) a(12,6) a(6,1) a(6,2) a(6,3) a(6,4) a(6,5) a(6,6) a(5,1) a(5,2) a(5,5) a(5,6) a(4,1) a(4,3) a(4,4) a(4,6) a(3,1) a(3,3) a(3,4) a(3,6) a(2,1) a(2,2) a(2,5) a(2,6) a(1,1) a(1,2) a(1,3) a(1,4) a(1,5) a(1,6) a(0,1) a(0,5) a(0,6) a(-1,4) a(-1,6) a(-2,3) a(-2,6) a(-3,2) a(-3,6) a(-4,1) a(-4,6) a(-5,6) a(7,0) a(8,-1) a(9,-2) a(10,-3) a(11,-4) a(12,-5) a(12,0) a(6,-4) a(6,-3) a(6,-2) a(6,-1) a(6,0) a(5,0) a(4,-1) a(0,7) a(1,7) a(2,7) a(5,7) a(-1,8) a(1,8) a(3,8) a(4,8) a(-2,9) a(1,9) a(3,9) a(-3,10) a(1,10) a(2,10) a(-4,11) a(1,11) a(-5,12) a(0,12) a(1,-4) a(1,0) a(2,-3) a(3,-2) a(6,-5) a(6,7) a(6,8) a(4,9) a(6,9) a(5,10) a(6,10) a(6,11) a(1,12) a(6,12) a(-5,0) a(0,-5) a(0,0) a(7,7) a(8,8) a(9,9) a(10,10) a(11,11) a(7,12) a(12,7) a(12,12)
Optimization: -3
Answer: 5
q(1,1) q(1,6) q(6,1) q(6,6) a(7,1) a(7,2) a(7,5) a(7,6) a(8,1) a(8,3) a(8,4) a(8,6) a(9,1) a(9,3) a(9,4) a(9,6) a(10,1) a(10,2) a(10,5) a(10,6) a(11,1) a(11,6) a(12,1) a(12,6) a(6,1) a(6,2) a(6,3) a(6,4) a(6,5) a(6,6) a(5,1) a(5,2) a(5,5) a(5,6) a(4,1) a(4,3) a(4,4) a(4,6) a(3,1) a(3,3) a(3,4) a(3,6) a(2,1) a(2,2) a(2,5) a(2,6) a(1,1) a(1,2) a(1,3) a(1,4) a(1,5) a(1,6) a(0,1) a(0,2) a(0,5) a(0,6) a(-1,1) a(-1,3) a(-1,4) a(-1,6) a(-2,1) a(-2,3) a(-2,4) a(-2,6) a(-3,1) a(-3,2) a(-3,5) a(-3,6) a(-4,1) a(-4,6) a(-5,1) a(-5,6) a(7,-5) a(7,0) a(8,-1) a(9,-2) a(10,-3) a(11,-4) a(12,-5) a(12,0) a(6,-4) a(6,-3) a(6,-2) a(6,-1) a(6,0) a(5,-3) a(5,0) a(4,-2) a(4,-1) a(3,-1) a(2,0) a(0,7) a(1,7) a(2,7) a(5,7) a(-1,8) a(1,8) a(3,8) a(4,8) a(-2,9) a(1,9) a(3,9) a(-3,10) a(1,10) a(2,10) a(-4,11) a(1,11) a(-5,7) a(-5,12) a(0,12) a(1,-5) a(1,-4) a(1,-3) a(1,-2) a(1,-1) a(1,0) a(2,-3) a(3,-2) a(6,-5) a(6,7) a(6,8) a(4,9) a(6,9) a(5,10) a(6,10) a(6,11) a(1,12) a(6,12) a(-5,-5) a(-5,0) a(-4,-4) a(-3,-3) a(-2,-2) a(-1,-1) a(0,-5) a(0,0) a(7,7) a(8,8) a(9,9) a(10,10) a(11,11) a(7,12) a(12,7) a(12,12)
Optimization: -4
Answer: 6
q(1,2) q(1,3) q(2,2) q(2,3) q(2,6) a(7,1) a(7,2) a(7,3) a(7,6) a(8,2) a(8,3) a(8,6) a(6,2) a(6,3) a(6,6) a(5,2) a(5,3) a(5,5) a(5,6) a(4,1) a(4,2) a(4,3) a(4,4) a(4,5) a(4,6) a(3,1) a(3,2) a(3,3) a(3,4) a(3,5) a(3,6) a(2,1) a(2,2) a(2,3) a(2,4) a(2,5) a(2,6) a(1,1) a(1,2) a(1,3) a(1,4) a(1,5) a(1,6) a(0,1) a(0,2) a(0,3) a(0,4) a(0,5) a(0,6) a(-1,1) a(-1,2) a(-1,3) a(-1,4) a(-1,5) a(-1,6) a(-2,2) a(-2,3) a(-2,5) a(-2,6) a(-3,1) a(-3,2) a(-3,3) a(-3,6) a(-4,2) a(-4,3) a(-4,6) a(-5,2) a(-5,3) a(7,-4) a(7,-3) a(7,-2) a(8,-4) a(8,-3) a(8,0) a(6,-3) a(6,-2) a(6,-1) a(5,-2) a(5,-1) a(5,0) a(4,-1) a(4,0) a(3,0) a(2,0) a(1,7) a(2,7) a(3,7) a(5,7) a(0,8) a(1,8) a(2,8) a(4,8) a(-2,7) a(-1,9) a(1,9) a(2,9) a(-3,7) a(-3,8) a(-2,10) a(2,10) a(-4,7) a(-4,8) a(-4,9) a(-3,11) a(-5,8) a(-5,9) a(-4,12) a(1,-4) a(1,-3) a(1,-2) a(1,-1) a(1,0) a(2,-4) a(2,-3) a(2,-2) a(2,-1) a(6,7) a(6,8) a(5,9) a(6,10) a(2,11) a(2,12) a(-5,-4) a(-5,-3) a(-4,-4) a(-4,-3) a(-4,-2) a(-4,0) a(-3,-3) a(-3,-2) a(-3,-1) a(-2,-2) a(-2,-1) a(-2,0) a(-1,-1) a(-1,0) a(0,0) a(7,7) a(7,8) a(8,8) a(7,9) a(8,9) a(7,11) a(8,12)
Optimization: -5
OPTIMUM FOUND

Models       : 6
  Optimum    : yes
Optimization : -5
Calls        : 1
Time         : 0.733s (Solving: 0.71s 1st Model: 0.00s Unsat: 0.71s)
CPU Time     : 0.730s

คุณช่วยกรุณาเขียนคำอธิบายเล็กน้อยได้ไหม?
Keyu Gan

2

Python 2 | 325 284 217 ไบต์

ลองออนไลน์!

from itertools import*
N=input()
r=range(N*N)
for n in r:
 g=r
 for s in combinations(g,n):
    for p in s:g=filter(lambda q:all([abs(q%N-p%N)!=abs(q/N-p/N),q%N!=p%N,q/N!=p/N]),g)
    if len(g)>=n:break
    g=r
 else:exit(n-1)

แก้ไข:แทนที่สิ่งอันดับด้วยจำนวนเต็มใน g และการแก้ไขอื่น ๆ

Edit2:ไบต์ลดลงเหลือ 217 ขอบคุณmusicman523และCalculatorFeline !

มันทำงานอย่างไร

โปรแกรมวนซ้ำตำแหน่งที่เป็นไปได้ทั้งหมดของnราชินีและกรองจุดที่ไม่สงบซึ่งgเกิดขึ้นเนื่องจากตำแหน่งของราชินี หากคะแนนที่เหลือมากกว่าnนั้นแสดงว่าเป็นไปได้ที่nกองทัพราชินีจะสามารถอยู่อย่างสงบสุขได้ หากสำหรับค่าถัดไปของnไม่พบสถานการณ์ที่สงบสุขโปรแกรมจะออกด้วยรหัสทางออก: n-1ซึ่งเป็นคำตอบ ในระยะสั้นก็คือกำลังดุร้าย

โปรแกรมสามารถทำได้เร็วขึ้นโดยเปลี่ยนสองบรรทัดสุดท้ายเป็น

for n in range(N**2):
    if not z(n,N):print n-1;break

2
เคล็ดลับ: 1 ช่องว่างและ 1 แท็บเป็นระดับการเยื้องที่แตกต่างกันใน Python 2 นอกจากนี้คุณสามารถใช้from module import*เพื่อนำเข้าทุกสิ่งจากโมดูลและบันทึกไบต์
CalculatorFeline


1

Haskell , 169 156 153 152 bytes

k!(a:b)=k!b++[a:c|c<-(k-1)!b]
k!x=[x|k==0]
q&l|p<-q![[x,y,x-y,x+y]|x<-l,y<-l]=or[all and$zipWith(/=)<$>b<*>w|b<-p,w<-p]
g n=last$filter(&[1..n])[0..n*n]

กำหนดฟังก์ชั่นgอาจจะเล่นกอล์ฟได้อีก ลองออนไลน์! เมื่อวันที่ติ้วเมื่อรวบรวมกับ-O2นี้จะใช้เวลาประมาณ 36 วินาทีสำหรับn = 4และเวลาออกบนn = 5 ความซับซ้อนเวลาที่ควรจะเป็นO (n 2 4 n 2 )

คำอธิบาย

เราวนซ้ำค่าที่เป็นไปได้สำหรับจำนวนของควีน ( q ) สำหรับแต่ละqเราสร้างเซตย่อยของ size- qทั้งหมดเป็น[1..n] 2ชุดของราชินีสีดำ ( b ) และชุดสีขาวหนึ่งชุด ( w ) จากนั้นแต่ละองค์ประกอบของbจะถูกตรวจสอบกับแต่ละองค์ประกอบของwเพื่อดูว่าพวกเขาแบ่งปันแถว, คอลัมน์, แนวทแยงหรือแนวทแยง สิ่งนี้ยังดูแลสองชิ้นที่แบ่งปันพิกัดเดียวกัน ค่าที่ยิ่งใหญ่ที่สุดของqที่ยอมรับการกำหนดค่าแบบสันติได้คือค่าสุดท้าย

สองบรรทัดแรกของโปรแกรมที่กำหนดฟังก์ชั่น!ซึ่งคำนวณ length- ksubsequences xของรายการ การติดตั้งใช้งานโดยการเรียกซ้ำขั้นพื้นฐาน: เลือกองค์ประกอบแรกที่จะอยู่ในชุดหรือไม่และเรียกคืนไปยังส่วนท้ายลดลงkหากจำเป็น k==0จากนั้นรายการที่ว่างเปล่าหรือถึงตรวจสอบว่า

k!(a:b)=       -- ! on integer k and list with head a and tail b is
 k!b++         -- the concatenation of k!b and
 [a:c|         -- the list of lists a:c where
  c<-(k-1)!b]  -- c is drawn from (k-1)!b.
k!x=           -- If x doesn't have the form a:b (which means that it's empty),
 [x|           -- the result is a list containing x
  k==0]        -- but only if k==0.

ฟังก์ชั่นเสริมที่สอง&ใช้หมายเลขq(จำนวนควีนทั้งสองข้าง) และรายการl(พิกัด x ของบอร์ดใช้เป็นพิกัด y) และส่งกลับค่าบูลีนที่ระบุว่ามีการกำหนดค่าที่ปลอดภัยหรือไม่ เราคำนวณแรกpรายการ length- qsubsequences ของรายการค่า[x,y,x-y,x+y]ที่xและช่วงกว่าy lพวกเขาเป็นตัวแทนของแถว, คอลัมน์, เส้นทแยงมุมและต่อต้านเส้นทแยงมุมของตาราง(x,y)บนกระดาน

q&l               -- & on inputs q and l:
 |p<-             -- define p as
  q!              -- the q-subsequences of
  [[x,y,x-y,x+y]  -- the list of these 4-lists
   |x<-l,y<-l]    -- where x and y are drawn independently from l.

q&lต่อไปเราจะมีผลมาจากการ เราวาดสองชุดจากbและจับคู่รายการทั้งสี่เข้าด้วยกันในรูปแบบที่เป็นไปได้ทั้งหมดและตรวจสอบว่าพวกเขาต่างกันในพิกัดทั้ง 4 เสมอ ถ้าตัวเลือกบางส่วนของและผลในผล truthy เรากลับมาwpbwTrue

=or            -- Does the following list contain a True:
 [all and$     -- every list contains only truthy values
  zipWith(/=)  -- if we zip with inequality
  <$>b<*>w     -- all elements of b and w in all possible ways,
 |b<-p,w<-p]   -- where b and w are drawn independently from p.

บรรทัดสุดท้ายคือฟังก์ชั่นหลัก ป.ร. ให้nไว้ก็แค่หาค่าที่เป็นไปได้มากที่สุดqซึ่งq&[1..n]เป็นเรื่องจริง

g n=              -- g on input n is
 last$            -- the last of
 filter(&[1..n])  -- those values q for which q&[1..n] is true
 [0..n*n]         -- in this list.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.