您的位置:首页 > 理论基础 > 计算机网络

2010杭州赛区网络预赛 1007 Tetris(DFS)

2010-09-20 20:30 309 查看
这个题其实没有什么特别的技巧,就是直接DFS就行了,至于时间嘛,按一般的DFS都不会超时。

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3647 这里还可以提交

这个题只要细心就没有多大的问题,要把所有的情况都考虑进去。

// 1007 mnlm 1.0
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int n, m;
char s[10];  // 积木下降的类型
int h[41];   // 储存现有状态,h[i]表示第i列的高度
bool DFS(int k)
{
int i;
if (k == 10)
{
return true;
}
switch (s[k])
{
case 'I':
for (i = 0; i < n; i++)
{
if (h[i] + 4 <= m)
{
h[i] += 4;
if (DFS(k + 1))
{
return true;
}
h[i] -= 4;
}
if (i + 3 < n &&
h[i] < m &&
h[i] == h[i + 1] &&
h[i + 1] == h[i + 2] &&
h[i + 2] == h[i + 3])
{
h[i]++;
h[i + 1]++;
h[i + 2]++;
h[i + 3]++;
if (DFS(k + 1))
{
return true;
}
h[i + 3]--;
h[i + 2]--;
h[i + 1]--;
h[i]--;
}
}
break;
case 'L':
for (i = 0; i < n - 1; i++)
{
if (h[i]+ 3 <= m &&
h[i] == h[i + 1])
{
h[i] += 3;
h[i + 1]++;
if (DFS(k + 1))
{
return true;
}
h[i + 1]--;
h[i] -= 3;
}
if (h[i + 1] + 3 <= m &&
h[i] == h[i + 1] + 2)
{
h[i]++;
h[i + 1] += 3;
if (DFS(k + 1))
{
return true;
}
h[i + 1] -= 3;
h[i]--;
}
if (i + 2 < n)
{
if (h[i] + 2 <= m &&
h[i] + 1 == h[i + 1] &&
h[i + 1] == h[i + 2])
{
h[i] += 2;
h[i + 1]++;
h[i + 2]++;
if (DFS(k + 1))
{
return true;
}
h[i + 2]--;
h[i + 1]--;
h[i] -= 2;
}
if (h[i + 2] + 2 <= m &&
h[i] == h[i + 1] &&
h[i + 1] == h[i + 2])
{
h[i]++;
h[i + 1]++;
h[i + 2] += 2;
if (DFS(k + 1))
{
return true;
}
h[i + 2] -= 2;
h[i + 1]--;
h[i]--;
}
}
}
break;
case 'J':
for (i = 0; i < n - 1; i++)
{
if (h[i + 1] + 3 <= m &&
h[i] == h[i + 1])
{
h[i]++;
h[i + 1] += 3;
if (DFS(k + 1))
{
return true;
}
h[i + 1] -= 3;
h[i]--;
}
if (h[i] + 3 <= m &&
h[i] + 2 == h[i + 1])
{
h[i] += 3;
h[i + 1]++;
if (DFS(k + 1))
{
return true;
}
h[i + 1]--;
h[i] -= 3;
}
if (i + 2 < n)
{
if (h[i] + 2 <= m &&
h[i] == h[i + 1] &&
h[i + 1] == h[i + 2])
{
h[i] += 2;
h[i + 1]++;
h[i + 2]++;
if (DFS(k + 1))
{
return true;
}
h[i + 2]--;
h[i + 1]--;
h[i] -= 2;
}
if (h[i + 2] + 2 <= m &&
h[i] == h[i + 1] &&
h[i + 1] == h[i + 2] + 1)
{
h[i]++;
h[i + 1]++;
h[i + 2] += 2;
if (DFS(k + 1))
{
return true;
}
h[i + 2] -= 2;
h[i + 1]--;
h[i]--;
}
}
}
break;
case 'O':
for (i = 0; i < n - 1; i++)
{
if (h[i] + 2 <= m &&
h[i] == h[i + 1])
{
h[i] += 2;
h[i + 1] += 2;
if (DFS(k + 1))
{
return true;
}
h[i + 1] -= 2;
h[i] -= 2;
}
}
break;
case 'S':
for (i = 0; i < n - 1; i++)
{
if (h[i] + 2 <= m &&
h[i] == h[i + 1] + 1)
{
h[i] += 2;
h[i + 1] += 2;
if (DFS(k + 1))
{
return true;
}
h[i + 1] -= 2;
h[i] -= 2;
}
if (i + 2 < n &&
h[i + 2] + 1 <= m &&
h[i] == h[i + 1] &&
h[i + 1] + 1 == h[i + 2])
{
h[i]++;
h[i + 1] += 2;
h[i + 2]++;
if (DFS(k + 1))
{
return true;
}
h[i + 2]--;
h[i + 1] -= 2;
h[i]--;
}
}
break;
case 'T':
for (i = 0; i < n - 1; i++)
{
if (h[i] + 3 <= m &&
h[i] + 1 == h[i + 1])
{
h[i] += 3;
h[i + 1]++;
if (DFS(k + 1))
{
return true;
}
h[i + 1]--;
h[i] -= 3;
}
if (h[i + 1] + 3 <= m &&
h[i] == h[i + 1] + 1)
{
h[i]++;
h[i + 1] += 3;
if (DFS(k + 1))
{
return true;
}
h[i + 1] -= 3;
h[i]--;
}
if (i + 2 < n &&
h[i + 1] + 2 <= m)
{
if (h[i] == h[i + 1] &&
h[i + 1] == h[i + 2])
{
h[i]++;
h[i + 1] += 2;
h[i + 2]++;
if (DFS(k + 1))
{
return true;
}
h[i + 2]--;
h[i + 1] -= 2;
h[i]--;
}
if (h[i] == h[i + 1] + 1 &&
h[i + 1] + 1 == h[i + 2])
{
h[i]++;
h[i + 1] += 2;
h[i + 2]++;
if (DFS(k + 1))
{
return true;
}
h[i + 2]--;
h[i + 1] -= 2;
h[i]--;
}
}
}
break;
case 'Z':
for (i = 0; i < n - 1; i++)
{
if (h[i + 1] + 2 <= m &&
h[i] + 1 == h[i + 1])
{
h[i] += 2;
h[i + 1] += 2;
if (DFS(k + 1))
{
return true;
}
h[i + 1] -= 2;
h[i] -= 2;
}
if (i + 2 < n &&
h[i] + 1 <= m &&
h[i] == h[i + 1] + 1 &&
h[i + 1] == h[i + 2])
{
h[i]++;
h[i + 1] += 2;
h[i + 2]++;
if (DFS(k + 1))
{
return true;
}
h[i + 2]--;
h[i + 1] -= 2;
h[i]--;
}
}
break;
default :;
}
return false;
}
int main()
{
while (1)
{
scanf("%d%d", &n, &m);
if (!n && !m)
{
break;
}
int i;
for (i = 0; i < 10; i++)
{
scanf("%s", &s[i]);
}
memset(h, 0, sizeof(h));
if (DFS(0))
{
printf("Yes/n");
}
else
{
printf("No/n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: