首页 > 其他 > 详细

回文时间(山东理工OJ)

时间:2014-04-14 17:07:33      阅读:454      评论:0      收藏:0      [点我收藏+]
#include<stdio.h>
#include<string.h>
#define max 10
int map[max][max];
int palce[max];
int ans[max];
/*
表示这一行的皇后放在哪一列
*/
int num;
int check(int t,int x,int n){
	  int i,j,k;
	  int flag=1;
	  
	  for(i=0;i<x;i++){
		if(map[t][i]==1){
			flag=0;
			return flag;
		}
	  }
	  for(j=0;j<t;j++){
		  if(map[j][x]==1)
		  {
			  flag=0;
			  return flag;
		  }
	  }
	  for(k=0;(t-k>=0)&&(x-k)>=0;k++){
		  if(map[t-k][x-k]==1){
			  flag=0;
			  return flag;
	  }
		  }
	  /*
	  对角线有两边
	  */
	  for(k=0;(t-k>=0)&&(x+k)<n;k++){
		  if(map[t-k][x+k]==1)
		  {
			  flag=0;
			  return flag;
		  }
	  }
return flag;
}
void dfs(int t,int n){
	/*n表示总共有多少个皇后

	*/
	int tempx,tempy;
	if(t==n){
		num++;
		/*
		for(int i=0;i<n;i++){
			printf("%d ",palce[i]);
		}
		printf("\n");
		*/
		return ;
	}
	for(int i=0;i<n;i++){
		if(check(t,i,n)==1){
			palce[t]=i;
			map[t][i]=1;
			dfs(t+1,n);
			map[t][i]=0;
			
		}
	}
	/*
	这里应该是走不下去了
	*/
	return ;

}
int main(){
	int n;
	/*
	n=5;
	map[1][2]=1;
	int a=check(2,1,n);
	printf("%d\n",a);
	*/
	/*
	这个题目会超时所以
	先把所有的结果保存起来比较好

	while(scanf("%d",&n)!=EOF){
		if(n==0)
			break;
		num=0;
		memset(map,0,sizeof(map));
			dfs(0,n);
			printf("%d\n",num);
		
	}
	*/
	for(int i=1;i<=10;i++){
		num=0;
		memset(map,0,sizeof(map));
		dfs(0,i);
		ans[i]=num;

	}
	while(scanf("%d",&n)!=EOF){
		if(n==0)
			break;
		printf("%d\n",ans[n]);
	}
	return 0;
}

回文时间(山东理工OJ),布布扣,bubuko.com

回文时间(山东理工OJ)

原文:http://blog.csdn.net/li_jun_09_05/article/details/23669511

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!