POJ 1321 棋盘分割 DFS

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#define MAXN 110 
#define N 21
using namespace std;
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
int dl[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
int dr[4][2]={{0,1},{-1,0,},{0,-1},{1,0}};
int sx,sy,ex,ey,n,m,k;
char G[MAXN][MAXN];
int ans;
struct prog
{
	char map[10][10];
	int x;	
};
void DFS(prog tmp,int n)
{
    if(n==0)
    {//如果要求放的所有棋子都已经放好了,则索命找到了答案,则计数+1并返回
        ans++;
        return ;
    }
    int i , j ;
    for ( i = tmp.x + 1 ; i <= m -n; i ++ )
    {//从上个棋子的下一行开始搜,如果剩余可放棋子数明显大于剩余行数,则可以知道此时无解
        for ( j = 0 ; j < m ; j ++ )
        {//从该行的第一个棋盘开始搜到最后一个
            if ( tmp.map[i][j]=='#')
            {//如果找到了一点可以放棋子
                prog tmp2;
                tmp2=tmp;
                tmp2.x=i;//记下改点的行数
                int k;
                for (k = i+1 ; k < m ; k ++)
                {//更新棋盘,因为,不会再向该行和该行之前的棋盘搜索,故只用更新该行下同列的棋盘
                    tmp2.map[k][j]='.';
                }
                DFS(tmp2,n-1);//放好一个棋子,继续搜
                
            }
        }
    }
}
int main()
{
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		if(m==-1&&n==-1)
			break;
		ans=0;
		prog map;
		map.x=-1;
		int i;
		for(int i=0;i<m;i++)
		{
			cin>>map.map[i];
		}
		DFS(map,n);
		cout<<ans<<endl;
	}
	//while(1);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值