kuangbin专题——简单搜索
A - 棋盘问题
题意
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
解法:n皇后的变形,注意放的位置不一定,并不是每一行都要放,计个step,然后dfs每一个点时,记得回溯上去处理一下,把vis[i]置为0,step--即可,然后处理完此次结束后,dfs(x+1),处理下一位;
#include<cstdio> #include<cstring> using namespace std; #define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++) #define per(i,j,k) for(int i=(int)k;i>=(int)j;i--) int step,ans,n,k; char mp[20][20]; bool vis[20]; void dfs(int x){ if(step==k){ ans++; return ; } if(x>=n)return ; for(int i=0;i<n;i++){ if(!vis[i]&&mp[x][i]=='#'){ step++; vis[i]=1; dfs(x+1); vis[i]=0; step--; } } dfs(x+1); } int main(){ while(~scanf("%d %d",&n,&k)){ memset(vis,0,sizeof vis); if(n+k<0)break; rep(i,0,n-1){ scanf("%s",mp[i]); } ans=step=0; dfs(0); printf("%d ",ans); } return 0; }
B - Dungeon Master
题意:就是个三维迷宫,直接广搜即可,用一个方向数组
#include<bits/stdc++.h> #include<queue> #include<cstring> using namespace std; #define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++) #define per(i,j,k) for(int i=(int)k;i>=(int)j;i--) #define pb push_back #define fi first #define se second typedef long long ll; typedef unsigned long long ull; typedef long double ldb; const int maxn=1e5+5; bool isprime[maxn]; void makeprime(){ memset(isprime,true,sizeof isprime); isprime[1]=0; for(int i=2;i*i<=maxn;i++){ if(isprime[i]==0)continue; for(int j=i*2;j<=maxn;j+=i){ isprime[j]=0; } } // rep(i,1,maxn){ // cout<<i<<" "<<isprime[i]<<endl; // } } struct point{int num,step;}; int ans,p,q; bool vis[maxn]; bool bfs(){ memset(vis,0,sizeof vis); vis[p]=1; point tmp,next; tmp.num=p,tmp.step=0; queue<point>Q; Q.push(tmp); while(!Q.empty()){ tmp=Q.front(); Q.pop(); vis[tmp.num]=1; if(tmp.num==q){ ans=tmp.step; return true; } int t=tmp.num; for(int i=0;i<4;i++){ for(int j=0;j<=9;j++){ t=tmp.num; if(i==0){ t-=t%10; t+=j; } else if(i==1){ t-=t%100/10*10; t+=j*10; } else if(i==2){ t-=t%1000/100*100; t+=j*100; } else if(i==3){ t-=t%10000/1000*1000; t+=j*1000; } if(t==tmp.num||t<1000||vis[t]||!isprime[t])continue; next.num=t,next.step=tmp.step+1; vis[t]=1; Q.push(next); } } } return false; } int main(){ makeprime(); int cas; scanf("%d",&cas); while(cas--){ memset(vis,0,sizeof vis); scanf("%d %d",&p,&q); ans=0; if(bfs())printf("%d ",ans); else printf("Impossible "); } return 0; }