slipblock

#include <iostream>
using namespace std;

int mx[4]={1,-1,0,0};
int my[4]={0,0,1,-1};
int map[10][10];
int map1[10][10];
int n;
int high;
int wide;
int xx1,yy1,xx2,yy2;
int blmin;
void slip(int nx1,int ny1,int nx2,int ny2,int step);
void search();
bool stop(int x,int y);
int main()
{
	freopen("in.txt","r",stdin);
	cin >>n;
	for(int i=0;i<n;i++)
	{
		blmin=10;
		cin >>high;
		cin >>wide;
		for(int j=0;j<high;j++)
		{
			for(int k=0;k<wide;k++)
			{
				cin >>map[j][k];
				map1[j][k]=map[j][k];
			}
		}
		search();
		slip(xx1,yy1,xx2,yy2,0);
		if(blmin==10)
			blmin=-1;
		cout <<blmin<<endl;
		/*for(int i=0;i<high;i++)
		{
			for(int j=0;j<wide;j++)
			{
				cout <<map1[i][j]<<" ";
			}
			cout <<endl;
		}
		cout <<xx1<<endl;
		cout <<yy1<<endl;
		cout <<xx2<<endl;
		cout <<yy2<<endl;
		cout <<step<<endl;*/
	}
	return 0;
}

void search()
{
	for(int i=0;i<high;i++)
		for(int j=0;j<wide;j++)
		{
			if(map[i][j]==1)
			{
				xx1=i;
				yy1=j;
			}
			if(map[i][j]==2)
			{
				xx2=i;
				yy2=j;
			}
		}
}
bool stop(int x,int y)
{
	bool ret=true;
	if(x>=high||y>=wide||x<0||y<0||map[x][y]==9||map1[x][y]==1||map1[x][y]==2)
		ret=false;
	return ret;
}
void slip(int nx1,int ny1,int nx2,int ny2,int step)
{
	int ret;
	
	if(step==9)
		return;
	if(map[nx1][ny1]==-1&&map[nx2][ny2]==-2)
	{
		if(step<blmin)
			blmin=step;
		return;
	}
	for(int i=0;i<4;i++)
	{
		int a=nx1;
		int b=ny1;
		int c=nx2;
		int d=ny2;
		map1[nx1][ny1]=0;
		while(1)
		{
			a=a+mx[i];
			b=b+my[i];
			ret=stop(a,b);
			if(ret==false)
			{
				a=a-mx[i];
				b=b-my[i];
				break;
			}
		}
		
		map1[a][b]=1;
		map1[nx2][ny2]=0;
		while(1)
		{
			c=c+mx[i];
			d=d+my[i];
			ret=stop(c,d);
			if(ret==false)
			{
				c=c-mx[i];
				d=d-my[i];
				break;
			}
		}
		
		map1[c][d]=2;
		map1[a][b]=0;
		while(1)
		{
			a=a+mx[i];
			b=b+my[i];
			ret=stop(a,b);
			if(ret==false)
			{
				a=a-mx[i];
				b=b-my[i];
				break;
			}
		}
		map1[a][b]=1;
		slip(a,b,c,d,step+1);
		map1[a][b]=0;
		map1[c][d]=0;
		map1[nx1][ny1]=1;
		map1[nx2][ny2]=2;
	}
}
原文地址:https://www.cnblogs.com/452035305qq/p/6278567.html