标签:
A*搜索练习,以还剩余多少种颜色为估价,写的时候把2打成了1查了一个多小时。
//codevs 2495
//by Cydiater
//2016.10.11
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <map>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <iomanip>
#include <algorithm>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
#define pii pair<int,int>
#define mp make_pair
const int MAXN=9;
const int oo=0x3f3f3f3f;
const int dx[4]={1,0,-1,0};
const int dy[4]={0,1,0,-1};
inline int read(){
char ch=getchar();int x=0,f=1;
while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
return x*f;
}
int N,color[MAXN][MAXN],rec[MAXN][MAXN],tmp[MAXN][MAXN],cnt[10];
bool OK,vis[MAXN][MAXN];
namespace solution{
void init(){
scanf("%d\n",&N);if(N==0)exit(0);
memset(rec,0,sizeof(rec));
up(i,1,N)up(j,1,N)color[i][j]=read();
}
void dfs(int x,int y,int col){
rec[x][y]=1;
up(i,0,3){
int tx=x+dx[i],ty=y+dy[i];
if(tx>N||tx<1||ty>N||ty<1||rec[tx][ty]==1)continue;
if(color[tx][ty]==col) dfs(tx,ty,col);
else rec[tx][ty]=2;
}
}
int get(){
int ans=0;
memset(cnt,0,sizeof(cnt));
up(i,1,N)up(j,1,N)if(rec[i][j]!=1&&!cnt[color[i][j]]){
ans++;cnt[color[i][j]]=1;
}
return ans;
}
bool fill(int col){
bool flag=0;
up(i,1,N)up(j,1,N)if(rec[i][j]==2&&color[i][j]==col){
flag=1;
dfs(i,j,color[i][j]);
}
return flag;
}
void search(int dep,int depth,int now){
if(OK)return;
int v=get();
if(v==0){
OK=1;
return;
}
if(dep+v>depth)return;
int ttt[MAXN][MAXN];
up(i,0,5){
memcpy(ttt,rec,sizeof(rec));
if(fill(i))search(dep+1,depth,i);
memcpy(rec,ttt,sizeof(ttt));
}
}
void slove(){
dfs(1,1,color[1][1]);
OK=0;
up(dep,0,20){
search(0,dep,color[1][1]);
if(OK){
printf("%d\n",dep);
return;
}
}
}
}
int main(){
using namespace solution;
while(1){
init();
slove();
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/Cydiater/p/5952345.html