京东消消乐最后一分钟AC代码
暴力递归+dfs+暴力判断,第二题迷宫题都没看懂也没仔细想了。
应该有更好的方法解。
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int res=25;
bool line3(vector<vector<int>> mm,int i,int j){
if (i<3&&mm[i+1][j]==mm[i][j]&&mm[i+2][j]==mm[i][j]) return true;
if (j<3&&mm[i][j+1]==mm[i][j]&&mm[i][j+2]==mm[i][j]) return true;
if (i<4&&j<4&&mm[i+1][j]==mm[i][j]&&mm[i][j+1]==mm[i][j]) return true;
if (i<4&&j<4&&mm[i+1][j]==mm[i][j]&&mm[i+1][j+1]==mm[i][j]) return true;
if (i<4&&j<4&&mm[i][j+1]==mm[i][j]&&mm[i+1][j+1]==mm[i][j]) return true;
if (i>=1&j>=1&&mm[i][j-1]==mm[i][j]&&mm[i-1][j]==mm[i][j]) return true;
return false;
}
void dfs(vector<vector<int>> &mm,int i,int j,int target){
if (i-1>=0&&mm[i-1][j]==target) {mm[i-1][j]=0;dfs(mm,i-1,j,target);}
if (i+1<5&&mm[i+1][j]==target){mm[i+1][j]=0;dfs(mm,i+1,j,target);}
if (j-1>=0&&mm[i][j-1]==target) {mm[i][j-1]=0;dfs(mm,i,j-1,target);}
if (j+1<5&&mm[i][j+1]==target){mm[i][j+1]=0;dfs(mm,i,j+1,target);}
}
void down(vector<vector<int>> &mm){
for (int j=0;j<5;j++){
int cnt=0;
for (int i=4;i>=0;i--){
if (mm[i][j]==0) cnt++;
else if (cnt>0){
mm[i+cnt][j]=mm[i][j];
mm[i][j]=0;
}
}
}
}
void recursive(vector<vector<int>> mm){
bool flag=true;
vector<vector<int>> tmpm;
flag=false;
int tmp=0;
for (int i=0;i<5;i++){
for (int j=0;j<5;j++){
tmpm=mm;
if (tmpm[i][j]>0){
if (line3(tmpm,i,j)){
dfs(tmpm,i,j,tmpm[i][j]);
tmpm[i][j]=0;
flag=true;
down(tmpm);
recursive(tmpm);
}
else tmp++;
}
}
}
if (tmp<res) res=tmp;
}
int main(){
vector<vector<int>> mm(5,vector<int>(5));
for (int i=0;i<5;i++){
for (int j=0;j<5;j++){
cin>>mm[i][j];
}
}
recursive(mm);
cout<<res<<endl;
} #京东##笔试题目#
