他暖暖第哪里错了
查看原帖
他暖暖第哪里错了
670584
Zhangikun楼主2023/9/14 20:08

#2 #3喜提Wrong Answer

#include<iostream>
#define int long long
using namespace std;
char a[10][10];
const int dx[]={0,-1,1,0,0},dy[]={0,0,0,-1,1};//方向数组
int h()//估价函数
{
	int maxi=0;
	for(int i=1;i<=4;i++)
	{
		int b=0,w=0;
		for(int j=1;j<=4;j++)
		{
			if(a[i][j]=='B')b++;
			if(a[i][j]=='W')w++;
		}
		maxi=max(maxi,max(b,w)); 
		b=w=0;
		for(int j=1;j<=4;j++)
		{
			if(a[j][i]=='B')b++;
			if(a[j][i]=='W')w++;
		}
		maxi=max(maxi,max(b,w));
	}
	int b=0,w=0;
	for(int i=1;i<=4;i++)
	{
		if(a[i][i]=='B')b++;
		if(a[i][i]=='W')w++;
	}
	maxi=max(maxi,max(b,w));
	b=w=0;
	for(int i=1,j=4;i<=4;i++,j--)
	{
		if(a[i][j]=='B')b++;
		if(a[i][j]=='W')w++;
	}
	return(4-max(maxi,max(b,w)))*2-1;//交替行棋,如果最好的情况下要走x次白棋,中间最少要走x-1次黑棋(黑棋同理)
}
bool dfs(int d,int ld)//黑棋先走
{
	if(d>ld)
	{
		return h()==-1;
	}
	for(int i=1;i<=4;i++)
	{
		for(int j=1;j<=4;j++)
		{
			if(a[i][j]=='O')
			{
				for(int k=1;k<=4;k++)
				{
					int x=i+dx[k],y=j+dy[k];
					if(x<1||4<x||y<1||4<y)continue;
					if(((d&1)&&a[x][y]=='B')||((d&1)==0&&a[x][y]=='W'))
					{
						swap(a[i][j],a[x][y]);
						if(/*d+h()<=ld*/1)
						{
							if(dfs(d+1,ld))
							{
								swap(a[i][j],a[x][y]);
								return 1;
							}
						}
						swap(a[i][j],a[x][y]);
					}
				}
			}
		}
	}
	return 0;
}
bool dfs2(int d,int ld)//白棋先走
{
	if(d>ld)
	{
		return h()==-1;
	}
	for(int i=1;i<=4;i++)
	{
		for(int j=1;j<=4;j++)
		{
			if(a[i][j]=='O')
			{
				for(int k=1;k<=4;k++)
				{
					int x=i+dx[k],y=j+dy[k];
					if(x<1||4<x||y<1||4<y)continue;
					if(((d&1)&&a[x][y]=='W')||((d&1)==0&&a[x][y]=='B'))
					{
						swap(a[i][j],a[x][y]);
						if(/*d+h()<=ld*/1)
						{
							if(dfs(d+1,ld))
							{
								swap(a[i][j],a[x][y]);
								return 1;
							}
						}
						swap(a[i][j],a[x][y]);
					}
				}
			}
		}
	}
	return 0;
}
inline void astar_iddfs()
{
	int i=0,j=0;
	for(;dfs(1,i)==0;i++);//cout<<i<<"\n";
	for(;dfs2(1,j)==0;j++);
	cout<<min(i,j);
  //分别算白棋黑棋分别先走的步数,取最小值
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	for(int i=1;i<=4;i++)for(int j=1;j<=4;j++)cin>>a[i][j];
	astar_iddfs();
}
2023/9/14 20:08
加载中...