A 棋盤問題
思路:DFS,與八皇后問題相似,解法是從第一列開始搜索,尋找位置,逐步依次向其它列尋找,數量滿足計數+1
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
char h[15][15];
int l[15];
int sum; // 棋子總數
int res; // 方案數
int n,k;
void dfs(int cur) // 代表此時位於cur列
{
if(k==sum)
{
res++;
return ;
}
if(cur>=n)
{
return ;
}
for(int i=0;i<n;i++)
{
if(h[i][cur]=='#'&&l[i]==0)
{
sum++;
l[i]++;
dfs(cur+1);
sum--;
l[i]--;
}
}
dfs(cur+1);
}
int main()
{
while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1)
{
memset(h,0,sizeof(h));
memset(l,0,sizeof(l));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>h[i][j];
}
}
res=sum=0;
dfs(0); // 從第0列開始搜索
cout<<res<<endl;
}
return 0;
}
B Dungeon Master
思路:經典BFS,從起點到終點,看代碼qwq
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
#define MAXN 50
char tu[MAXN][MAXN][MAXN];
int vis[MAXN][MAXN][MAXN];
struct stu
{
int a,b,c;
int coun;
};
queue<stu>mm;
int l,r,c;
int mov[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
int BFS(int u,int v,int w)
{
queue<stu>hh;
stu HA;
stu tmp;//當前位置
stu zz;//過渡
HA.coun=0;
HA.a=u;
HA.b=v;
HA.c=w;
vis[u][v][w]=1;
hh.push(HA);
while(!hh.empty())
{
tmp=hh.front();
if(tu[tmp.a][tmp.b][tmp.c]=='E')
{
return tmp.coun;
}
hh.pop();
for(int i=0; i<6; i++)
{
u=tmp.a+mov[i][0];
v=tmp.b+mov[i][1];
w=tmp.c+mov[i][2];
if((!vis[u][v][w])&&((tu[u][v][w]=='.')||(tu[u][v][w]=='E'))&&(u<=l)&&(u>=0)&&(v>=0)&&(v<=r)&&(w<=c)&&(w>=0))
{
zz.a=u;
zz.b=v;
zz.c=w;
zz.coun=tmp.coun+1;
hh.push(zz);
vis[u][v][w]++;
}
}
}
return -1;
}
int main()
{
int u,v,w;
int result;
while(scanf("%d%d%d",&l,&r,&c)&&(l||r||c))
{
memset(tu,0,sizeof(tu));
memset(vis,0,sizeof(vis));
for(int i=0; i<l; i++)
{
for(int j=0; j<r; j++)
{
for(int k=0; k<c; k++)
{
cin>>tu[i][j][k];
if(tu[i][j][k]=='S')
{
u=i;
v=j;
w=k;
}
}
}
}
result=BFS(u,v,w);
if(result>=0)
{
printf("Escaped in %d minute(s).\n",result);
}
else
{
printf("Trapped!\n");
}
}
return 0;
}