您的位置:首页 > 其它

poj-1321-棋盘问题-回溯

2013-01-24 16:48 232 查看
题意:

给你一个棋盘,#的地方可以放棋。*的地方不能放棋。让你把k个棋子放入这个棋盘上,

要求两个棋子之间不可以同行或者同列。

做法:

和八皇后的问题很像。不可以同行,那么每一行至多有一个棋子。

可以对棋子的方法进行回溯。从第一行往下放,放下一个棋子之后,

把棋子所在的列标记一下,然后接着在下一行放棋子。直至棋子放完。

注意:

主要注意一下回溯函数的结束标志。

#include<iostream>
#include<stdio.h>
#include<string.h>
#define mem(map) memset(map,0,sizeof(map))
using namespace std;
int count;
int n,k;
int map[9][9];
int leny[9];
void dfs(int x,int y,int z)
{
    int i,j;
    if(z==k)
    {
        count++;
        return ;
    }
    for(i=x+1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(map[i][j]==1&&leny[j]==0)
            {
                leny[j]=1;
                dfs(i,j,z+1);
                leny[j]=0;
            }
        }
    }
}
int main()
{
    int i,j;
    char str;
    while(scanf("%d%d%*c",&n,&k)&&(n+1||k+1))
    {
        mem(map);
        mem(leny);
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                scanf("%c",&str);
                if(str=='#')map[i][j]=1;
            }
            getchar();
        }
        count=0;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(map[i][j]==1)
                {
                    leny[j]=1;
                    dfs(i,j,1);
                    leny[j]=0;
                }
            }
        }
        printf("%d\n",count);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: