[GDCPC2023] Peg Solitaire

题目传送门

题意

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

思路

\(1 \le n,m \le 6\),于是 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;
}
posted @ 2024-08-21 16:33  WuMin4  阅读(39)  评论(0)    收藏  举报