poj1321 棋盘问题

描述:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

例如:

4 4
...#
..#.
.#..
#...    只有一种方案

解决方案:dfs 从下至下 遍历每一行,选取改行后者不选取改行 

code:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k;
int cnt,num;
char map[10][10];
bool place[10];
void dfs(int i)//第i行
{
    int j;
    if(k==num){
        cnt++;
        return;
    }
    if(i>=n)return;
    for(j=0;j<n;j++)
    {
        if(!place[j]&&map[i][j]=='#')
        {
            place[j]=true;
            num++;
            dfs(i+1);
            place[j]=false;
            num--;
        }
    }
    dfs(i+1);//不选第i行
}
int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        if(n==-1&&k==-1)break;
        int i;
        cnt=0;
        num=0;
        memset(place,false,sizeof(place));
        for(i=0;i<n;i++)scanf("%s",map[i]);
        dfs(0);
        printf("%d\n",cnt);
    }
    
    return 0;
}
poj1321

 poj 2251 Dungeon Master 

描述:三维迷宫

例如:

1 3 3
S##
#E#
###

 一层的3*3的迷宫,S起点 E终点 #墙 .路,没有通路

 解决:分north, south, east, west, up or down. 六个方向广搜

code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct Point
{
    int x,y,z;
    int step;
    Point(){}
    Point(int _x,int _y,int _z,int _step):x(_x),y(_y),z(_z),step(_step){}
};
int L,R,C;
queue<Point>q;
char map[50][50][50];//z x y
bool vis[50][50][50];
int sx,sy,sz,ex,ey,ez;
int f[6][3]={{0,-1,0},{0,1,0},{0,0,-1},{0,0,1},{1,0,0},{-1,0,0}};//L,R,C north, south, east, west, up or down. 
bool flag;
void bfs()
{
    int x,y,z,i;
    flag=false;
    while(!q.empty())q.pop();
    memset(vis,false,sizeof(vis));
    q.push(Point(sx,sy,sz,0));
    vis[sz][sx][sy]=true;
    while(!q.empty()){
        Point t;
        memcpy(&t,&q.front(),sizeof(t));
        q.pop();

    //    printf("** %d %d %d %d\n",t.x,t.y,t.z,t.step);

        if(t.x==ex&&t.y==ey&&t.z==ez){
            printf("Escaped in %d minute(s).\n",t.step);
            flag=true;
            return;
        }
        for(i=0;i<6;i++)
        {
            x=t.x+f[i][1];
            y=t.y+f[i][2];
            z=t.z+f[i][0];
            if(x>=0&&x<R&&y>=0&&y<C&&z>=0&&z<L&&!vis[z][x][y]&&map[z][x][y]!='#')
            {
                vis[z][x][y]=true;
                q.push(Point(x,y,z,t.step+1));
            }
        }
    }
}
int main()
{
    while(~scanf("%d%d%d",&L,&R,&C))
    {
        int k,i,j;

        if(L==0&&R==0&&C==0)break;
        for(k=0;k<L;k++)
        {
            for(i=0;i<R;i++)
            {
                scanf("%s",map[k][i]);
                for(j=0;j<C;j++)
                {
                    if(map[k][i][j]=='S')
                    {
                        sx=i;
                        sy=j;
                        sz=k;
                    }
                    if(map[k][i][j]=='E')
                    {
                        ex=i;
                        ey=j;
                        ez=k;
                    }
                }
            }
        }
        bfs();
        if(flag==false)puts("Trapped!");
    }
    return 0;
}
poj1321

 

 

 


posted on 2015-01-17 16:27  kylehz  阅读(135)  评论(0编辑  收藏  举报