rt,程序一直在把第一个方块左移右移左移右移,然而最后还正常结束了,没有爆栈?
#include <bits/stdc++.h>
using namespace std;
int n,s[8][6],s2[8][6],ans1[6],ans2[6],ans3[6];
void a_to_b(int (&a)[8][6],int (&b)[8][6]){
for(int i=1;i<=7;i++){
for(int j=1;j<=5;j++){
b[i][j]=a[i][j];
}
}
}
void down(int x,int y){
if(s[x][y]==0){
return ;
}
for(int i=x;i<7;i++){
if(s[i+1][y]==0){
swap(s[i+1][y],s[i][y]);
}
else{
break;
}
}
}
void move(int x,int y,int r,int c){
swap(s[x][y],s[r][c]);
down(r,c);
for(int i=x-1;i>=1;i--){
down(i,y);
}
}
void proccess(){
a_to_b(s,s2);
for(int i=1;i<=7;i++){
for(int j=1;j<=3;j++){
if(s2[i][j]==s2[i][j+1] && s2[i][j+1]==s2[i][j+2]){
s[i][j]=s[i][j+1]=s[i][j+2]=0;
}
}
}
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
if(s2[j+1][i]==s2[j+2][i] && s2[j+2][i]==s2[j+3][i]){
s[j+1][i]=s[j+2][i]=s[j+3][i]=0;
}
}
}
for(int i=7;i>=1;i--){
for(int j=1;j<=5;j++){
down(i,j);
}
}
}
bool check(){
for(int i=1;i<=7;i++){
for(int j=1;j<=5;j++){
if(s[i][j]!=0){
return false;
}
}
}
return true;
}
void print2(){
for(int i=1;i<=7;i++){
for(int j=1;j<=5;j++){
cout<<s[i][j];
}
cout<<'\n';
}
cout<<'\n';
}
void print(){
for(int i=1;i<=n;i++){
cout<<ans1[i]<<' '<<ans2[i]<<' '<<ans3[i]<<'\n';
}
exit(0);
}
void dfs(int step){
//print2();
if(check()){
print();
return ;
}
if(step>n){
return ;
}
int s3[8][6];
a_to_b(s,s3);
for(int i=7;i>=1;i--){
for(int j=1;j<=5;j++){
if(s[i][j]==0){
continue;
}
if(j<=4){
ans1[step]=i;
ans2[step]=j;
ans3[step]=1;
move(i,j,i,j+1);
proccess();
dfs(step+1);
a_to_b(s3,s);
}
if(j>=2 && s[i][j-1]==0){
ans1[step]=i;
ans2[step]=j;
ans3[step]=-1;
move(i,j,i,j-1);
proccess();
dfs(step+1);
a_to_b(s3,s);
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=5;i++){
int a;
for(int j=7;j>=1;j--){
cin>>a;
if(a==0){
break;
}
s[j][i]=a;
}
}
dfs(1);
return 0;
}
/*
5
0
1 0
1 3 0
2 4 4 3 4 3 0
1 2 2 0
*/