uva 639 - Don't Get Rooked

原题

这题比起八皇后问题更复杂。有两种状态转移方式:直接进入下一行搜索;在这一行选一个,仍在这一行搜索。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct Pos
{
	int x,y;
};

Pos C[16];
int n,max,mat[6][6],vis[6][6];

int is_capture(int x,int y,int s)
{
	int i,j,ok;
	for(i=0;i<s;i++)
	{
		if(C[i].x==x)
		{
			ok=1;
			int y1,y2;
			y1=C[i].y<y? C[i].y:y;
			y2=C[i].y+y-y1;
			//printf("%d %d\n",y1,y2);
			for(j=y1+1;j<y2;j++)  if(mat[C[i].x][j])
			{
				ok=0;
				break;
			}
			if(ok) return 1;
		}
		if(C[i].y==y)
		{
			int x1,x2;
			x1=C[i].x<x? C[i].x:x;
			x2=C[i].x+x-x1;
			ok=1;
			//printf("%d %d\n",x1,x2);
			for(j=x1+1;j<x2;j++) if(mat[j][y])
			{
				ok=0;
				break;
			}
			if(ok) return 1;
		}
	}
	return 0;
}

void search(int cur,int s)
{
	if(cur==n) 
	{
		if(max<s) max=s;
	}
	else
	{
		for(int i=0;i<n;i++) if(!mat[cur][i] && 
	  !vis[cur][i] && !is_capture(cur,i,s))
   	 {
		C[s].x=cur;
		C[s].y=i;
		vis[cur][i]=1;
		search(cur,s+1);
		//search(cur+1,s+1);
		vis[cur][i]=0;
	 }
	    search(cur+1,s);
	} 
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("639.txt","r",stdin);
#endif
	char s[6];
	while(scanf("%d",&n)==1 && n)
	{
		int i,j;
		memset(mat,0,sizeof(mat));
		memset(vis,0,sizeof(vis));
		for(i=0;i<n;i++)
		{
			scanf("%s",s);
			for(j=0;j<n;j++) 
			  if(s[j]=='X') mat[i][j]=1;
			  else mat[i][j]=0;
		}
		//for(i=0;i<n;i++,printf("\n"))
		  //for(j=0;j<n;j++) printf("%d",mat[i][j]);
  		max=0;
  		search(0,0);
  		printf("%d\n",max);
	}
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值