雁城传奇|

WuMin4

园龄:6个月粉丝:0关注:0

[GDCPC2023] Peg Solitaire

题目传送门

题意

每次可以选择棋盘上的一个棋子,让这个棋子跳过相邻的一个棋子并且吃掉跳过的棋子,问你棋盘上最少能剩余几枚棋子。

思路

1n,m6,于是 dfs + 回溯暴力枚举。

具体见代码:

#include<bits/stdc++.h>
using namespace std;
int T,n,m,k,ans;
int mv[4][2]={{2,0},{-2,0},{0,2},{0,-2}};
bool c[10][10];
bool canMove(int x,int y,int dx,int dy){
	int nx=x+dx,ny=y+dy;
	int jx=x+dx/2,jy=y+dy/2;
	if(nx<1||ny<1||nx>n||ny>m) return false;
	if(c[jx][jy]==false) return false;
	if(c[nx][ny]==true) return false;
	return true;
}
void dfs(int mink){
	ans=min(ans,mink);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(c[i][j]==true){
				for(int v=0;v<4;v++){
					int dx=mv[v][0],dy=mv[v][1];
					if(canMove(i,j,dx,dy)){
						c[i][j]=false;
						c[i+dx/2][j+dy/2]=false;
						c[i+dx][j+dy]=true;
						dfs(mink-1);
						c[i][j]=true;
						c[i+dx/2][j+dy/2]=true;
						c[i+dx][j+dy]=false;
					}
				}
			}
		}
	}
}
int main(){
	cin>>T;
	while(T--){
		memset(c,0,sizeof(c));
		ans=INT_MAX;
		cin>>n>>m>>k;
		for(int x,y,i=1;i<=k;i++){
			cin>>x>>y;
			c[x][y]=true;
		}
		dfs(k);
		cout<<ans<<endl;
	}
	return 0;
}

本文作者:WuMin4

本文链接:https://www.cnblogs.com/WuMin4/p/18371957

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   WuMin4  阅读(16)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起