dalao们能帮我剪枝吗
  • 板块UVA1505 Flood-it!
  • 楼主S0CRiA
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/7/13 11:32
  • 上次更新2023/11/4 14:56:43
查看原帖
dalao们能帮我剪枝吗
390770
S0CRiA楼主2021/7/13 11:32
//acwing194
#include <bits/stdc++.h>
#define F(i,a,b) for(int i=(a); i<=(b); ++i)
using namespace std;

int n,mp[10][10],dep;
inline void floodfill(int k){
	int l=mp[1][1]; mp[1][1]=k;
	queue<pair<int,int> > q; q.push(make_pair(1,1));
	while(!q.empty()){
		int x=q.front().first,y=q.front().second; q.pop();
		if(x+1<=n&&mp[x+1][y]==l) mp[x+1][y]=k,q.push(make_pair(x+1,y));
		if(y+1<=n&&mp[x][y+1]==l) mp[x][y+1]=k,q.push(make_pair(x,y+1));
	}
	return;
}
inline bool dfs(int step){
	int cnt=0,sum[6]; memset(sum,0,sizeof(sum));
	F(i,1,n) F(j,1,n) if(sum[mp[i][j]]==0) ++sum[mp[i][j]],++cnt;
	if(cnt==1) return 1;
	if(step+cnt-1>dep) return 0;
	
	int t[10][10];
	memcpy(t,mp,sizeof(mp));
	F(i,0,5){
		if(!sum[i]) continue;
		floodfill(i);
		if(dfs(step+1)) return 1;
		memcpy(mp,t,sizeof(t));
	}
	return 0;
}

int main(){
	while(cin>>n && n){
		F(i,1,n) F(j,1,n) cin>>mp[i][j];
		dep=0; while(!dfs(0)) ++dep; cout<<dep<<'\n';
	}
	return 0;
}
2021/7/13 11:32
加载中...