2019.3.3 kuangbin训练 poj1321 poj2251
poj1321
题意:
给一个n*n
的棋盘,#
是可以下棋的区域 .
是不可以下棋的区域
有k
个相同棋子,问有多少种摆法?要求任意2个棋子不能在同一行或同一列
题解:
显然这题要用到dfs和回溯法
由题意可知一行只能摆放一个棋子,所以dfs可以用行数和剩余棋子个数进行枚举,用一维数组vis[]记录列的状态(vis[i]=1表示第i列有棋子)
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,k;
char m[10][10];
int ans;
int vis[10];
void dfs(int r,int cnt)
{
if(cnt<=0)
{
ans++;
return;
}
if(r>=n)
return;
for(int i=0;i<n;i++)
if(m[r][i]=='#' && !vis[i])
{
vis[i]=1;
dfs(r+1,cnt-1);
vis[i]=0;
}
dfs(r+1,cnt);
}
int main()
{
while(scanf("%d %d",&n,&k)!=EOF)
{
ans=0;
memset(vis,0,sizeof(vis));
if(n==-1 && k==-1)
break;
for(int i=0;i<n;i++)
scanf("%s",m[i]);
dfs(0,k);
printf("%d\n",ans);
}
return 0;
}
poj2251
题意:
给一个R*C*L
的三维地图 .
是可以走的区域 #
是不可以走的区域 S
是起点 E
是终点 每走一步需要1分钟 问从S
到E
最少需要多少分钟?
每步可以 向东/西/南/北/上/下 走
题解:
显然这题要用到bfs
用结构体表示每一步的状态(重载了==
便于判断)
struct node
{
int x,y,z;
int step;
node(int xx=-1,int yy=-1,int zz=-1,int stepp=0)
{
x=xx;y=yy;z=zz;step=stepp;
}
bool operator == (const node a) const
{
if(x==a.x && y==a.y && z==a.z)
return true;
else return false;
}
};
用
int X[]={-1,0,1,0,0,0};
int Y[]={0,1,0,-1,0,0};
int Z[]={0,0,0,0,1,-1};
分别表示 向北、东、南、西、上、下 移动
算法步骤:
1.找到S和E的坐标
2.把S加入队列中
3.每次取出队列中的一个元素,若与E相等,结束。若与E不相等,尝试向6个方向移动1步,若合法的话将新坐标加入列队中,并将step+1,重复该步骤。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
int L,R,C;
char m[31][31][31];
int vis[31][31][31];
int ans;
struct node
{
int x,y,z;
int step;
node(int xx=-1,int yy=-1,int zz=-1,int stepp=0)
{
x=xx;y=yy;z=zz;step=stepp;
}
bool operator == (const node a) const
{
if(x==a.x && y==a.y && z==a.z)
return true;
else return false;
}
};
node S,E;
queue<node> q;
int X[]={-1,0,1,0,0,0};
int Y[]={0,1,0,-1,0,0};
int Z[]={0,0,0,0,1,-1};
void bfs()
{
while(!q.empty())
q.pop();
q.push(S);
while(!q.empty())
{
node temp=q.front();
if(temp==E)
{
ans=temp.step;
return;
}
q.pop();
for(int i=0;i<6;i++)
{
int nx,ny,nz;
nx=temp.x+X[i];
ny=temp.y+Y[i];
nz=temp.z+Z[i];
if(nz<0 || nz>=L || nx<0 || nx>=R || ny<0 || ny>=C)
continue;
if(vis[nz][nx][ny] || m[nz][nx][ny]=='#')
continue;
vis[nz][nx][ny]=1;
q.push(node(nx,ny,nz,temp.step+1));
}
}
}
int main()
{
while(scanf("%d %d %d",&L,&R,&C)!=EOF && (L+R+C))
{
ans=-1;
memset(vis,0,sizeof(vis));
for(int i=0;i<L;i++)
for(int j=0;j<R;j++)
{
scanf("%s",m[i][j]);
for(int k=0;k<C;k++)
{
if(m[i][j][k]=='S')
{
S.z=i;
S.x=j;
S.y=k;
S.step=0;
}
else if(m[i][j][k]=='E')
{
E.z=i;
E.x=j;
E.y=k;
E.step=0;
}
}
}
bfs();
if(ans==-1)
{
printf("Trapped!\n");
}
else
{
printf("Escaped in %d minute(s).\n",ans);
}
}
return 0;
}