现在的位置: 首页 > 综合 > 正文

POJ 1321 棋盘问题

2013年08月15日 ⁄ 综合 ⁄ 共 630字 ⁄ 字号 评论关闭
//很经典的回溯题目,要好好学习递归的思想
#include<iostream>
using namespace std;
int mat[8][8];
int rr[8];
int cc[8];
char ch;
int n,k,res;
int time;

//t表示所在的行
void backtrace(int t){
	if(time==k){
		res++;
		return;
	}
	if(t>=n)
		return;
	for(int i=0;i<n;i++){
		if(mat[t][i]==1){
			if(!rr[t]&&!cc[i]){
				time++;
				rr[t]=cc[i]=1;
				backtrace(t+1);
				time--;
				rr[t]=cc[i]=0;
			}
		}
	}
	backtrace(t+1);//=======================很关键的作用
}

int main()
{
	while(scanf("%d%d",&n,&k)!=EOF){
		if(n==-1&&k==-1)
			break;
		getchar();
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				scanf("%c",&ch);
				if(ch=='#'){
					mat[i][j]=1;
				}
				if(ch=='.')
					mat[i][j]=0;
			}
			getchar();
		}
		res=time=0;
		memset(rr,0,sizeof(rr));
		memset(cc,0,sizeof(cc));
		backtrace(0);
		printf("%d\n",res);
	}
}

抱歉!评论已关闭.