其实就是一道搜索模拟题。因为数据量小,用char就够了。

 /* 3295 */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std; typedef struct {
char m[][];
char x, y;
char s, c;
} node_t; typedef struct subNode_t {
char x, y;
subNode_t() {}
subNode_t(char xx, char yy) {
x = xx; y = yy;
}
} subNode_t; bool visit[][];
node_t beg, cur;
int n, m, cnt;
char dir[][] = {
-,,,-,,,,
};
queue<node_t> Q;
queue<subNode_t> q; inline bool check(char x, char y) {
return x< || x>=n || y< || y>=m;
} void remove(char x, char y, char cl) {
char i, j, k;
subNode_t nd; ++cur.s;
cur.m[x][y] = ;
visit[x][y] = true;
--cur.c;
q.push(subNode_t(x, y)); while (!q.empty()) {
nd = q.front();
q.pop();
for (i=; i<; ++i) {
x = nd.x + dir[i][];
y = nd.y + dir[i][];
if (check(x, y) || visit[x][y])
continue;
if (cur.m[x][y] == cl) {
cur.m[x][y] = ;
visit[x][y] = true;
--cur.c;
q.push(subNode_t(x, y));
}
}
}
} node_t shift() {
char i, j, k, r;
bool flag;
node_t nd; // copy from cur
nd.s = cur.s;
nd.c = cur.c;
nd.x = cur.x;
nd.y = cur.y;
memset(nd.m, , sizeof(nd.m)); // fall down
r = ;
for (j=; j<m; ++j) {
k = n-;
for (i=n-; i>=; --i)
if (cur.m[i][j])
nd.m[k--][r] = cur.m[i][j];
if (k < n-)
++r;
} return nd;
} char bfs() {
char i, j, k;
node_t nd; while (!Q.empty())
Q.pop(); memset(visit, false, sizeof(visit));
for (i=; i<n; ++i) {
for (j=; j<n; ++j) {
if (beg.m[i][j] && !visit[i][j]) {
cur = beg;
remove(i, j, beg.m[i][j]);
nd = shift();
Q.push(nd);
}
}
} while (!Q.empty()) {
beg = Q.front();
Q.pop();
if (beg.c == )
return beg.s;
memset(visit, false, sizeof(visit));
for (i=; i<n; ++i) {
for (j=; j<m; ++j) {
if (beg.m[i][j] && !visit[i][j]) {
cur = beg;
remove(i, j, beg.m[i][j]);
nd = shift();
Q.push(nd);
}
}
}
} return ;
} int main() {
int i, j, k; #ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
#endif while (scanf("%d%d",&n,&m) != EOF) {
cnt = ;
beg.s = ;
for (i=; i<n; ++i) {
for (j=; j<m; ++j) {
scanf("%d", &k);
beg.m[i][j] = k;
if (k)
++cnt;
}
}
beg.c = cnt;
k = bfs();
printf("%d\n", k);
} return ;
}

最新文章

  1. 转:SAAS 测试
  2. 终于解决:升级至.NET 4.6.1后VS2015生成WCF客户端代理类的问题
  3. 【URAL 1486】Equal Squares
  4. java-GUI图形用户界面
  5. Linux 学习手记(5):使用Vim文本编辑器
  6. Almost Sorted Array---hdu5532(简单dp)
  7. NoSQL性能测试:MongoDB VS SequoiaDB
  8. php封装+租房子练习题
  9. Redis-消息发布与订阅
  10. 3、C#基础 - C# 的 Hello World
  11. redux 简介
  12. centos7 安装mongodb
  13. [NIO-1]缓冲区
  14. torchvision 批量可视化图片
  15. java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method 解决办法
  16. NGINX源代码自我总结(一)
  17. ansible 列表变量、字典变量
  18. 金蝶K3,名称或代码在系统中已被使用,由于数据移动,未能继续以NOLOCK方式扫描
  19. SaltStack数据系统-Pillar
  20. EntityFrameworkCore 数据库生成与迁移

热门文章

  1. block代码块介绍
  2. Ubuntu上安装jdk,Jboss
  3. day01-day04总结- Python 数据类型及其用法
  4. 11.1 morning
  5. ASP.NET中如何生成图形验证码
  6. 编程基础-msdn编程指南笔记
  7. oracle 导出导入数据
  8. Eclipse中看java源代码
  9. 【转】iOS开发UI篇—程序启动原理和UIApplication
  10. FMDB多线程读写问题,使用FMDataBaseQueue操作可以解决同时打开一个链接de读写问题