题意
每次可以选择棋盘上的一个棋子,让这个棋子跳过相邻的一个棋子并且吃掉跳过的棋子,问你棋盘上最少能剩余几枚棋子。
思路
$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;
}
标签:false,int,GDCPC2023,ny,棋子,Solitaire,ans,return,Peg
From: https://www.cnblogs.com/WuMin4/p/18371957