3 条题解

  • 1
    @ 2022-8-5 19:06:55
    #include<cstdio>
    #include<iostream> 
    #include<cstring>
    #define INF 536870912
    using namespace std;
    char map[6][6];
    char check[6][6]={
    	'0','0','0','0','0','0',
    	'0','1','1','1','1','1',
    	'0','0','1','1','1','1',
    	'0','0','0','*','1','1',
    	'0','0','0','0','0','1',
    	'0','0','0','0','0','0',
    };
    int xm[9]={0,-2,-2,-1,-1,1,1,2,2};
    int ym[9]={0,-1,1,-2,2,-2,2,-1,1};
    int ans;
    inline void swap(char &p1,char &p2){
    	char mid=p1; p1=p2; p2=mid;
    }
    inline int dif(){
    	int ret=0;
    	for(int i=1;i<=5;i++){
    		for(int j=1;j<=5;j++){
    			if(map[i][j]!=check[i][j]) ret++;
    		}
    	}
    	return ret;
    }
    inline void dfs(int x,int y,int d,int f){
    	int l=dif();
    	if(d+l>16) return ;
    	if(d>=ans) return ;
    	if(l==0){
    		ans=d; return ;
    	}
    	for(int i=1;i<=8;i++){
    		if((x+xm[i]<1)||(x+xm[i]>5)) continue;
    		if((y+ym[i]<1)||(y+ym[i]>5)) continue;
    		if(f+i!=9){
    			swap(map[y+ym[i]][x+xm[i]],map[y][x]);
    			dfs(x+xm[i],y+ym[i],d+1,i);
    			swap(map[y+ym[i]][x+xm[i]],map[y][x]);
    		}
    	}
    }
    inline void init(){
    	int x,y;
    	for(int i=1;i<=5;i++) cin>>map[i]+1;
    	for(int i=1;i<=5;i++){
    		for(int j=1;j<=5;j++){
    			if(map[i][j]=='*') { x=j; y=i; }
    		}
    	}
    	ans=25;
    	dfs(x,y,0,0);
    	printf("%d\n",ans==25?-1:ans);
    }
    int main(){
    	int t;
    	scanf("%d",&t);
    	while(t--)init();
    	return 0;
    }
    

    信息

    ID
    106
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    56
    已通过
    45
    上传者