poj 1321 棋盘问题(简单dfs)+ 2251 Dungeon Master(简单三维bfs)

【...】

   简单搜索题。

【题目】

棋盘问题

【思路】

类似八皇后问题但是比八皇后简单的dfs问题。

【代码】

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <map>
#include <list>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#define mem(a) memset(a,0,sizeof(a))
#define go(i,a,b) for(int i=a;i<=b;i++)
#define og(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e6;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
int n,k,ans;
char c,vis[10][10],f[10];
void dfs(int x,int step)
{
    if(step==k)
    {
        ans++; return;
    }
    if(x>n) return;
    for(int y=1;y<=n;y++)
    {
        if(!vis[x][y]&&!f[y])
        {
           f[y]=1;
           dfs(x+1,step+1);
           f[y]=0;
        }
    }
    dfs(x+1,step);
}
main()
{
    while(~scanf("%d%d",&n,&k))
    {
        mem(vis); mem(f);
        if(n==-1&&k==-1) break;
        go(i,1,n)
           go(j,1,n)
           {
               scanf(" %c",&c);
               if(c=='.') vis[i][j]=1;
           }
        ans=0; dfs(1,0);
        printf("%d\n",ans);
    }
}

【题目】

Dungeon Master

【思路】

三维迷宫问题。

【代码】

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <map>
#include <set>
#include <list>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#define mem(a,b) memset(a,b,sizeof(a))
#define go(i,a,b) for(int i=a;i<=b;i++)
#define og(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=10000;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
struct p{
    int x,y,z,step;
}f,ff;
int dir[6][3]={{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
int n,m,r,sx,sy,sz,ex,ey,ez;
char a[35][35][35];
int b[35][35][35];
bool check(p a)
{
    if(a.x>=0&&a.x<n&&a.y>=0&&a.y<m&&a.z>=0&&a.z<r) return true;
    return false;
}
int bfs()
{
    queue <p> q; while(!q.empty()) q.pop();
    f.x=sx,f.y=sy,f.z=sz,f.step=0;
    b[f.x][f.y][f.z]=1;
    q.push(f);
    while(!q.empty())
    {
        f=q.front(); q.pop();
        if(f.x==ex&&f.y==ey&&f.z==ez) return f.step;
        go(i,0,5)
        {
            ff.x=f.x+dir[i][0];
            ff.y=f.y+dir[i][1];
            ff.z=f.z+dir[i][2];
            if(a[ff.x][ff.y][ff.z]!='#'&&check(ff)&&b[ff.x][ff.y][ff.z]==0)
            {
                b[ff.x][ff.y][ff.z]=1;
                ff.step=f.step+1;
                q.push(ff);
            }
        }
    }
    return -1;
}
main()
{
    while(~scanf("%d%d%d",&n,&m,&r))
    {
        if(n==0&&m==0&&r==0) break;
        mem(a,'\0'); mem(b,0);
        go(i,0,n-1)
        {
            go(j,0,m-1)
            {
                scanf("%s",a[i][j]);
                go(k,0,r-1)
                {
                    if(a[i][j][k]=='S') sx=i,sy=j,sz=k;
                    else if(a[i][j][k]=='E') ex=i,ey=j,ez=k;
                }
            }
        }
        int ans=bfs();
        if(ans==-1) puts("Trapped!");
        else printf("Escaped in %d minute(s).\n",ans);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值