An interesting mobile game
This problem will be judged on HDU. Original ID: 3295
64-bit integer IO format: %I64d Java class name: Main
Can you solve it?The following picture show this problem better.
This game is played on a rectangular area.This area is divided into some equal square grid..There are N rows and M columns.For each grid,there may be a colored square block or nothing.
Each grid has a number.
“0” represents this grid have nothing.
“1” represents this grid have a red square block.
“2” represents this grid have a blue square block.
“3” represents this grid have a green square block.
“4” represents this grid have a yellow square block.
1. Each step,when you choose a grid have a colored square block, A group of this block and some connected blocks that are the same color would be removed from the board. no matter how many square blocks are in this group.
2. When a group of blocks is removed, the blocks above those removed ones fall down into the empty space. When an entire column of blocks is removed, all the columns to the right of that column shift to the left to fill the empty columns.
Now give you the number of the row and column and the data of each grid.You should calculate how many steps can make the entire rectangular area have no colored square blocks at least.
Input
Output
Sample Input
5 6
0 0 0 3 4 4
0 1 1 3 3 3
2 2 1 2 3 3
1 1 1 1 3 3
2 2 1 4 4 4
Sample Output
4
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <climits>
#include <algorithm>
#include <cmath>
#include <queue>
#define LL long long
#define INF 0x3f3f3f
using namespace std;
int table[][],r,c,ans,cnt;
const int dir[][] = {,-,,,-,,,};
bool vis[][];
struct node{
int x,y;
};
struct po{
int x,y,c;
};
bool check(int (*t)[]) {
for(int i = r; i ; i--) {
for(int j = ; j <= c; j++)
if(t[i][j]) return false;
}
return true;
}
bool cmp(const po &a,const po &b){
return a.c > b.c;
}
void calc(int (*t)[],int x,int y,const int color){
vis[x][y] = true;
cnt++;
for(int i = ; i < ; i++){
int px = x+dir[i][];
int py =y+dir[i][];
if(!vis[px][py] && t[px][py] == color)
calc(t,px,py,color);
}
}
void cancle(int (*t)[],int x,int y,const int color){
bool vis[][] = {false};
queue<node>q;
vis[x][y] = true;
int i,j,px,py;
t[x][y] = ;
q.push((node){x,y});
while(!q.empty()){
node temp = q.front();
q.pop();
for(i = ; i < ; i++){
px = temp.x+dir[i][];
py = temp.y+dir[i][];//这个地方写成dir[i][0]害我调了很久
if(!vis[px][py] && t[px][py] == color){
vis[px][py] = true;
t[px][py] = ;
q.push((node){px,py});
}
}
}
}
void shift(int (*t)[]){
int i,j,k;
bool isempty[] = {false};
for(j = ; j <= c; j++){
for(i = r-; i; i--){
for(k = i;k < r &&!t[k+][j]&&t[k][j]; k++)
swap(t[k+][j],t[k][j]);
}
if(!t[r][j]) isempty[j] = true;
}
for(j = c-; j; j--){
if(isempty[j]){
for(i = ; i <= r; i++){
for(k = j; k <= c; k++)
t[i][k] = t[i][k+];
}
}
}
}
bool dfs(int (*t)[],int step){
int mp[][],i,j,m = ;
bool flag;
if(check(t) && ans == step) return true;
if(step > ans) return false;
po p[];
memset(vis,false,sizeof(vis));
for(i = r; i; i--){
flag = true;
for(j = ; j <= c; j++){
if(t[i][j]) flag = false;
if(t[i][j] && !vis[i][j]){
cnt = ;
calc(t,i,j,t[i][j]);
p[m++] = (po){i,j,cnt};
}
}
if(flag) break;
}
sort(p,p+m,cmp);
for(i = ; i < m; i++){
memcpy(mp,t,sizeof(mp));
cancle(mp,p[i].x,p[i].y,t[p[i].x][p[i].y]);
shift(mp);
if(dfs(mp,step+)) return true;
}
return false;
}
int main() {
int i,j;
while(~scanf("%d %d",&r,&c)) {
memset(table,,sizeof(table));
for(i = ; i <= r; i++)
for(j = ; j <= c; j++)
scanf("%d",table[i]+j);
if(check(table)) {puts("");continue;}
for(ans = ;; ans++)
if(dfs(table,)) break;
printf("%d\n",ans);
}
return ;
}