program mayan; type tyy=array[0..10,0..10] of longint; var f:tyy; n,i,a,b:longint; x,y,z:array[0..10] of longint; function jiancha(ff:tyy):boolean; //检查最低层是否都消去 var i,j:longint; begin for i:=0 to 4 do if ff[i,0]<>0 then exit(false); exit(true) end; procedure print; var i:longint; begin for i:=1 to n do writeln(x[i],' ',y[i],' ',z[i]); //close(input); close(output); halt; //若有多种方案则以x为第一关键字按字典序输出,因为搜索时按x从0到4搜索的,故找到第一种方案是可以直接退出程序 end; procedure dfs(k:longint; ff:tyy); forward; procedure check(k:longint; ff:tyy); var bt:array[0..4,0..7] of boolean; boo:boolean; i,j,kk,t:longint; begin boo:=false; while (not boo) do //判断是否能下降,若没有下降则说明没有能消除的方块 begin for i:=0 to 4 do for j:=0 to 7 do bt[i,j]:=false; //初始化bt,记录能否消除 for i:=0 to 4 do for j:=0 to 7 do //消除三个连续相同的 begin if ff[i,j]=0 then continue; if (ff[i,j]=ff[i,j+1])and(ff[i,j+1]=ff[i,j+2])and(ff[i,j]<>0)then begin bt[i,j]:=true; bt[i,j+1]:=true; bt[i,j+2]:=true; end; if (ff[i,j]=ff[i+1,j])and(ff[i+1,j]=ff[i+2,j])and(ff[i,j]<>0)then begin bt[i,j]:=true; bt[i+1,j]:=true; bt[i+2,j]:=true; end; end; for i:=0 to 4 do for j:=0 to 7 do if bt[i,j] then ff[i,j]:=0; boo:=true; for i:=0 to 4 do //下降 for j:=0 to 7 do if ff[i,j]=0 then begin t:=j; while (t<=7)and(ff[i,t]=0) do inc(t); if t>7 then break; for kk:=0 to t-j do begin ff[i,j+kk]:=ff[i,t+kk]; ff[i,t+kk]:=0; end; boo:=false; end; if boo then break; end; if (k<>n+1)and(jiancha(ff)) then exit; //若不是在规定步数走完,则退出 if (k=n+1)and(jiancha(ff)) then print; //若恰好在规定步数消完,则输出 dfs(k,ff); end; procedure dfs(k:longint; ff:tyy); var i,j,tt:longint; begin if k>n then exit; for j:=0 to 4 do for i:=0 to 7 do begin if (ff[j,i]=0)then break; if (ff[j-1,i]=0)and(j<>0)and(ff[j,i]<>ff[j-1,i]) then //若可以交换,则尝试交换 begin x[k]:=j; y[k]:=i; z[k]:=-1; tt:=ff[j,i]; ff[j,i]:=ff[j-1,i]; ff[j-1,i]:=tt; check(k+1,ff); tt:=ff[j,i]; ff[j,i]:=ff[j-1,i]; ff[j-1,i]:=tt; x[k]:=0; y[k]:=0; z[k]:=0; end; if j=4 then continue; //若搜索到最后一列,则不能向右移动,退出本次循环 if ff[j,i]=ff[j+1,i] then continue; x[k]:=j; y[k]:=i; z[k]:=1; tt:=ff[j,i]; ff[j,i]:=ff[j+1,i]; ff[j+1,i]:=tt; check(k+1,ff); tt:=ff[j,i]; ff[j,i]:=ff[j+1,i]; ff[j+1,i]:=tt; x[k]:=0; y[k]:=0; z[k]:=0; end; end; begin //assign(input,'mayan.in');reset(input); //assign(output,'mayan.out');rewrite(output); readln(n); for i:=0 to 4 do //读入数据 begin b:=-1; repeat read(a); inc(b); f[i,b]:=a; until a=0; end; x[0]:=-1; y[0]:=-1; z[0]:=-2; //将x、y、z数组初始化 dfs(1,f); writeln('-1'); //若没有解决方案,输出-1 //close(input); //close(output); end. /************************************************************** Problem: 2306 User: admin Language: Pascal Result: Wrong Answer ****************************************************************/