南邮 OJ 1593 8皇后问题

8皇后问题

时间限制(普通/Java) :  2000 MS/ 6000 MS          运行内存限制 : 65536 KByte
总提交 : 1127            测试通过 : 141 

比赛描述

在8×8格的国际象棋上摆放八个皇后,请你判断她们是否互相攻击,即任意两个皇后都处于同一行、或同一列或同一斜线上。



输入

输入包含多个测试用例(不超过104)。先给出测试用例数。然后是每个测试用例。每个测试用例包括8行,每一行用8个字符表示棋盘上皇后放置情况,“Q”代表皇后,“#”代表空。

输出

 对于每个测试用例,输出一行,依次包含:

l         “Case #: ”,#表示序号

l         如果测试用例中的八个皇后互相攻击,输出Yes,否则输出No

样例输入

2
Q#######
###Q####
#####Q##
##Q#####
#######Q
####Q###
######Q#
##Q#####
#######Q
###Q####
Q#######
##Q#####
#####Q##
#Q######
######Q#
####Q###

样例输出

Case 1: Yes
Case 2: No

提示

 

题目来源

NUPT




#include<iostream>
#define N 8
using namespace std;

bool isDanger(int row,int col,char chess[N][N]){
	int i,j;
	//判断同一列
	for(i=0,j=col;i<N;++i){
		if(i!=row && 'Q'==chess[i][j]){
			return 1;
		}
	}
	//判断同一行
	for(i=row,j=0;j<N;++j){
		if(j!=col && 'Q'==chess[i][j]){
			return 1;
		}
	}
	//判断左上方
	for(i=row-1,j=col-1;i>=0,j>=0;--i,--j){
		if('Q'==chess[i][j]){
			return 1;
		}
	}
	//判断右上方
	for(i=row-1,j=col+1;i>=0,j<N;--i,++j){
		if('Q'==chess[i][j]){
			return 1;
		}
	}
	//判断右下方
	for(i=row+1,j=col+1;i<N,j<N;++i,++j){
		if('Q'==chess[i][j]){
			return 1;
		}
	}
	//判断左下方
	for(i=row+1,j=col-1;i<N,j>=0;++i,--j){
		if('Q'==chess[i][j]){
			return 1;
		}
	}
	return 0;
}

bool willAttack(char chess[N][N]){
	int i,j;
	for(i=0;i<N;++i){
		for(j=0;j<N;++j){
			if('Q'==chess[i][j] && isDanger(i,j,chess)){
				return 1; 
			}
		}
	}
	return 0;
}
int main(){
	char chess[N][N];
	int i,j,n,m;
	cin>>n;
	for(m=1;m<=n;++m){
		for(i=0;i<N;++i){
			for(j=0;j<N;++j){
				cin>>chess[i][j];
			}
		}
		cout<<"Case "<<m<<": ";
		if(willAttack(chess)){
			cout<<"Yes"<<endl;
		}else{
			cout<<"No"<<endl;
		}
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值