Luogu 2346/codevs 1004(IDDFS)

传送门

题解:

可以BFS+Hash判重,但是本蒟蒻还是把此题当做迭代加深的模板题来做。

所谓迭代加深就是指每次限定一个迭代深度,到达这一层就返回,如果找不到解再扩大限制重复搜索直到搜到解,否则直接返回答案。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char s[5][5];
int sx[2],sy[2],cnt=0,ans;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
inline void swap(char &x,char &y) {x^=y^=x^=y;}
inline bool cck() {
	for (int i=1;i<=4;++i) {
		if (s[i][1]==s[i][2]&&s[i][2]==s[i][3]&&s[i][3]==s[i][4]) return true;
		if (s[1][i]==s[2][i]&&s[2][i]==s[3][i]&&s[3][i]==s[4][i]) return true;
	}
	if (s[1][1]==s[2][2]&&s[2][2]==s[3][3]&&s[3][3]==s[4][4]) return true;
	if (s[1][4]==s[2][3]&&s[2][3]==s[3][2]&&s[3][2]==s[4][1]) return true;
	return false;
}
inline bool in(int x,int y,char c) {
	return x>0&&x<5&&y>0&&y<5&&s[x][y]^c;
}
bool IDDFS(int x1,int y1,int x2,int y2,char cur,int step) {
	if (step==ans) return cck();
	for (int i=0;i<4;++i) {
		int ax=x1+dx[i],ay=y1+dy[i],bx=x2+dx[i],by=y2+dy[i];
		if (in(ax,ay,cur)) {
			swap(s[ax][ay],s[x1][y1]);
			if (IDDFS(ax,ay,x2,y2,cur=='B'?'W':'B',step+1)) return true;
			swap(s[ax][ay],s[x1][y1]);
		}
		if (in(bx,by,cur)) {
			swap(s[bx][by],s[x2][y2]);
			if (IDDFS(x1,y1,bx,by,cur=='B'?'W':'B',step+1)) return true;
			swap(s[bx][by],s[x2][y2]);
		}
	}
	return false;
}
int main() {
//	freopen("P2346.in","r",stdin);
	for (int i=1;i<=4;++i) {
		scanf("%s",s[i]+1);
		for (int j=1;j<=4;++j)
			if (s[i][j]=='O') sx[cnt]=i,sy[cnt]=j,++cnt;
	}
	for (ans=1;ans<=0x3f3f3f3f;++ans) {
		if (IDDFS(sx[0],sy[0],sx[1],sy[1],'B',0)) {printf("%d\n",ans);return 0;}
		if (IDDFS(sx[0],sy[0],sx[1],sy[1],'W',0)) {printf("%d\n",ans);return 0;}
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值