NOIp 2011 mayan游戏 搜索

搜索。

因为要求字典序最小 所以都右移 除非那个方格为空。

代码如下:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #define For(i,x,y) for(int i=x;i<=y;++i)
 6 using namespace std;
 7 int a[10][10];
 8 int cnt[10];int n;    int ncnt[10];
 9 int qx[10],qy[10],qg[10];
10 inline bool check()
11 {
12     int v[10][10];memset(v,0,sizeof(v));
13     memset(ncnt,0,sizeof(ncnt));
14     For(i,0,4)
15     {
16         For(j,0,6)
17         {
18             if(a[i][j])a[i][ncnt[i]++]=a[i][j];
19         }
20         For(j,ncnt[i],6)a[i][j]=0;
21     }
22     bool flag=false;
23     For(i,0,4)
24     {
25         For(j,0,6)
26         {
27             if(!a[i][j])continue;
28             int k=0;int u=a[i][j];
29             for(k=j+1;a[i][k]==u;++k);
30             if(k-j>=3){flag=1;For(p,j,k-1)v[i][p]=1;}
31             for(k=i+1;a[k][j]==u;++k);
32             if(k-i>=3){flag=1;For(p,i,k-1)v[p][j]=1;}
33         }
34     }
35     if(flag)For(i,0,4)For(j,0,6)if(v[i][j]==1)a[i][j]=0;
36     For(i,0,4)cnt[i]=ncnt[i];
37     return flag;
38 }
39 inline bool done()
40 {
41     For(i,0,4)For(j,0,6)if(a[i][j])return 0;return 1;
42 }
43 void dfs(int step)
44 {
45     int tmp[10][10],tcnt[10];
46     while(check());
47     if(done())
48     {
49         For(i,1,step-1)
50             printf("%d %d %d\n",qx[i],qy[i],qg[i]);
51         exit(0);
52     }
53     if(step==n+1)return;
54     For(i,0,4)For(j,0,6)tmp[i][j]=a[i][j];
55     For(i,0,4)tcnt[i]=cnt[i];
56     For(i,0,4)
57     {
58         For(j,0,cnt[i])
59         {
60             if(i!=4&&a[i][j]!=a[i+1][j]&&a[i][j])
61             {
62                 swap(a[i][j],a[i+1][j]);qx[step]=i;qy[step]=j;qg[step]=1;
63                 dfs(step+1);
64                 For(i,0,4)For(j,0,6)a[i][j]=tmp[i][j];
65                 For(i,0,4)cnt[i]=tcnt[i];
66             }
67             if(i!=0&&!a[i-1][j])
68             {
69                 swap(a[i-1][j],a[i][j]);
70                 qx[step]=i;qy[step]=j;qg[step]=-1;
71                 dfs(step+1);
72                 swap(a[i-1][j],a[i][j]);
73                 For(i,0,4)For(j,0,6)a[i][j]=tmp[i][j];
74                 For(i,0,4)cnt[i]=tcnt[i];
75             }
76         }
77     }
78 }
79 int main()
80 {
81     cin>>n;
82     For(i,0,4)
83     {
84         int x;cin>>x;
85         while(x)
86         {
87             a[i][cnt[i]++]=x;
88             cin>>x;
89         }
90     }
91     dfs(1);
92     cout<<-1;
93 }
时间: 2024-10-17 06:52:23

NOIp 2011 mayan游戏 搜索的相关文章

noip提高组2011 Mayan游戏

Mayan游戏 描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.**游戏通关是指在规定的步数内消除所有的方块,**消除方块的规则如下: 1.每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见图6到图7):如果目标位置上没有方块,那么被拖动的方块将从原来的竖列中抽出,并从

NOIP2011tg mayan游戏(搜索)

题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1 .每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6 到图7 ):如果目标位置上没有方块,那么被拖动的方块将从原来的竖列

NOIP2011 Mayan游戏(搜索)

第一反应是搜索题,想了一下如果用BFS的话,由于状态过多,可能超内存,因此我用的DFS. 这里我们讨论一下剪枝条件: 如果当前状态有一种颜色的数量小于3,那么这种颜色就无法被消除,因此我们可以提前退出迭代. 如果两个连着的方块颜色是相同的话,我们不用交换. 如果两个非空的方块交换,我们只用考虑左边那个方块右移,而不用考虑右边方块左移的情况,这样就能做到右移优先. 如果一个方块是空的,它的右边非空,我们就只用考虑它右边的方块左移,当枚举到它右边方块的时候也不需要再考虑左移的情况. 注意下落清除方块

P1312 Mayan游戏 [模拟][搜索]

P1312 Mayan游戏 这道题跟斗地主都是大模拟啊!稍微挂一点可能就爆零了! 图肯定能存,直接二维数组扔进去即可. 然后套dfs模板,搜索就先照那样搜. 核心操作有两个:一个是判断那些块可以消掉,一个是把那些可以消的消了. 第一个操作的核心代码是这样的: for(int i = 1; i <= 5; i++) { for(int j = 1; j <= 7; j++) { if(G[i][j] && i - 1 >= 1 && i + 1 <=

NOIP 2011 Day 1

NOIP 2011 Day 1 tags: NOIP 搜索 categories: 信息学竞赛 总结 铺地毯 选择客栈 Mayan游戏 铺地毯 Solution 因为只会询问一个点被谁覆盖, 而且后面的地毯会覆盖前面的地毯, 所以只需要从后往前枚举地毯, 只要能覆盖这个点就是最终覆盖它的地毯. Code #include<iostream> #include<cstdio> using namespace std; int x[10005]; int y[10005]; int a

【noip2011】【codevs1136】Mayan游戏

3.Mayan 游戏(mayan.cpp/c/pas)[问题描述]Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下:1.每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6 到图7):如果

洛谷P1312 [NOIOP2011提高组 Day1T3]Mayan游戏

Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1 .每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将 交换位置(参见输入输出样例说明中的图6 到图7 ):如果目标位置上没有方块,那么被拖动的

NOIp 2011 Day1 解题报告

1.    铺地毯 送分题…… 枚举给定矩形,判定给定点是否在矩形内.求出标号最大的哪个矩形即可. 复杂度O(N) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int n,a[10010],b[10010],g

洛谷 P1312 Mayan游戏

P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1 .每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参见输入输出样例说明中的图6 到图7 ):如果目标位置上没有方块,那