描述
Mayan puzzle是最近流行起来的一个游戏。游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。**游戏通关是指在规定的步数内消除所有的方块,**消除方块的规则如下:
1、每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见图6到图7);如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从目标位置上掉落(直到不悬空,参见图1和图2);
2、任一时刻,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除(参见图1到图3)。
注意:
a) 如果同时有多组方块满足消除条件,几组方块会同时被消除(例如下面图4,三个颜色为1的方块和三个颜色为2的方块会同时被消除,最后剩下一个颜色为2的方块)。
b) 当出现行和列都满足消除条件且行列共享某个方块时,行和列上满足消除条件的所有方块会被同时消除(例如下面图5所示的情形,5个方块会同时被消除)。
3、方块消除之后,消除位置之上的方块将掉落,掉落后可能会引起新的方块消除。注意:掉落的过程中将不会有方块的消除。
上面图1到图3给出了在棋盘上移动一块方块之后棋盘的变化。棋盘的左下角方块的坐标为(0, 0),将位于(3, 3)的方块向左移动之后,游戏界面从图1变成图2所示的状态,此时在一竖列上有连续三块颜色为4的方块,满足消除条件,消除连续3块颜色为4的方块后,上方的颜色为3的方块掉落,形成图3所示的局面。
格式
输入格式
第一行为一个正整数n,表示要求游戏关的步数。
接下来的5行,描述7*5的游戏界面。每行若干个整数,每两个整数之间用一个空格隔开,每行以一个0 结束,自下向上表示每竖列方块的颜色编号(颜色不多于10种,从1开始顺序编号,相同数字表示相同颜色)。
输入数据保证初始棋盘中没有可以消除的方块。
输出格式
如果有解决方案,输出n行,每行包含3个整数x,y,g,表示一次移动,每两个整数之间用一个空格隔开,其中(x,y)表示要移动的方块的坐标,g表示移动的方向,1表示向右移动,-1表示向左移动。**注意:多组解时,按照x为第一关键字,y为第二关键字,1优先于-1,给出一组字典序最小的解。游戏界面左下角的坐标为(0, 0)。**
如果没有解决方案,输出一行,包含一个整数-1。
样例1
样例输入1
3
1 0
2 1 0
2 3 4 0
3 1 0
2 4 3 4 0
样例输出1
2 1 1
3 1 1
3 0 1
限制
3s
搜索优化
1.如果当前图中某种颜色块少于3块,剪枝
2.如果左块和右块颜色相等,则不用移动
不使用2只能过8个点
然而测试数据太弱了,还是有些数据过不了,比如:
5
1 3 2 0
1 3 5 4 0
2 2 5 3 0
3 4 4 5 1 0
0
会超时
1 #include<iostream> 2 #include<string> 3 #include<fstream> 4 using namespace std; 5 //ifstream fin("fin.txt"); 6 7 8 int n,ans[6][3]; 9 bool findans=0; 10 11 void copy(int g[][8],int map[][8]){ 12 for(int x=1;x<=5;++x) 13 for(int y=1;y<=7;++y) 14 g[x][y]=map[x][y]; 15 } 16 17 void Down(int x,int map[][8]){ 18 int y=7; 19 while(true) 20 { 21 for(;y>=1;--y) 22 if(map[x][y]!=0) break; 23 int y0; 24 for(y0=y-1;y0>=1;--y0) 25 if(map[x][y0]==0) break; 26 if(y0>=1) 27 { 28 for(int y1=y0;y1<7;++y1) 29 map[x][y1]=map[x][y1+1]; 30 map[x][7]=0; 31 y--; 32 } 33 else break; 34 } 35 return ; 36 } 37 38 bool Erase(int map[][8]){ 39 int g[6][8];bool isErase=0; 40 copy(g,map); 41 for(int x=1;x<=5;++x) 42 { 43 int y; 44 for(y=1;y<=7;++y) 45 if(map[x][y]==0) break; 46 else 47 { 48 int x1; 49 for(x1=x+1;x1<=5;++x1) 50 if(map[x1][y]!=map[x][y]) break; 51 if(x1-x>=3) 52 { 53 for(int i=x;i<x1;++i) 54 g[i][y]=0; 55 isErase=1; 56 57 } 58 59 60 61 int y1; 62 for(y1=y+1;y1<=7;++y1) 63 if(map[x][y]!=map[x][y1]) break; 64 if(y1-y>=3) 65 { 66 for(int j=y;j<y1;++j) 67 g[x][j]=0; 68 isErase=1; 69 } 70 } 71 } 72 if(isErase) 73 for(int x=1;x<=5;++x) 74 Down(x,g); 75 copy(map,g); 76 return isErase; 77 78 } 79 80 bool Impossible(int map[][8]){ 81 int tot[11]={0}; 82 for(int x=1;x<=5;++x) 83 for(int y=1;y<=7;++y) 84 if(map[x][y]==0) break; 85 else tot[map[x][y]]++; 86 for(int i=1;i<=10;++i) 87 if(tot[i]!=0&&tot[i]<3) return true; 88 return false; 89 } 90 91 bool FindAns(int map[][8]){ 92 for(int x=1;x<=5;++x) 93 for(int y=1;y<=7;++y) 94 if(map[x][y]!=0) return false; 95 findans=true; 96 return true; 97 98 } 99 100 void print(int map[][8]){ 101 for(int y=7;y>=1;--y,cout<<endl) 102 for(int x=1;x<=5;++x) 103 cout<<map[x][y]<<" "; 104 } 105 106 void Search(int d,int pre[][8],int map[][8]){ 107 //剪枝一 108 if(findans||Impossible(map)) return ; 109 if(d>=n) 110 { 111 if(FindAns(map)) 112 for(int i=1;i<=n;++i) 113 cout<<ans[i][0]-1<<" "<<ans[i][1]-1<<" "<<ans[i][2]<<endl; 114 return; 115 } 116 117 int g[6][8]={0}; 118 119 120 for(int x=1;x<=5;++x) 121 { 122 int y; 123 for(y=1;y<=7;++y) 124 if(map[x][y]==0) break; 125 else 126 { 127 //右移,剪枝2 128 if(x<5)//&&map[x][y]!=map[x+1][y]) 129 { 130 copy(g,map); 131 swap(g[x][y],g[x+1][y]); 132 // print(g); 133 // system("pause"); 134 Down(x,g); 135 Down(x+1,g); 136 while(Erase(g)); 137 ans[d+1][0]=x; 138 ans[d+1][1]=y; 139 ans[d+1][2]=1; 140 Search(d+1,map,g); 141 } 142 //左移,剪枝2 143 if(x>1)//&&map[x][y]!=map[x-1][y]) 144 { 145 copy(g,map); 146 swap(g[x][y],g[x-1][y]); 147 Down(x,g); 148 Down(x-1,g); 149 while(Erase(g)); 150 ans[d+1][0]=x; 151 ans[d+1][1]=y; 152 ans[d+1][2]=-1; 153 Search(d+1,map,g); 154 } 155 } 156 } 157 } 158 159 160 int main() 161 { 162 163 int map[6][8]={0}; 164 cin>>n; 165 int y=1; 166 for(int x=1;x<=5;++x) 167 { 168 while(true) 169 { 170 cin>>map[x][y]; 171 if(map[x][y]==0) {y=1;break;} 172 y++; 173 } 174 } 175 Search(0,map,map); 176 if(!findans) cout<<-1<<endl; 177 178 // system("pause"); 179 }