题目:
8皇后问题
时间限制(普通/Java) : 2000 MS/ 6000 MS 运行内存限制 : 65536 KByte
总提交 : 1116 测试通过 : 137
总提交 : 1116 测试通过 : 137
题目描述
在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
题目分析:
简单题。因为一开始漏掉了判断是否同一斜线的情况,所以那个判断是否在同一些线上是后来才加上的。所以显得有点乱。不过AC还是没问题的。
代码如下:
/*
* aa2.cpp
*
* Created on: 2015年3月24日
* Author: Administrator
*/
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn = 8;
struct Point{
int x;
int y;
}points[maxn];
char map[maxn+1][maxn+1];
bool visited[maxn];
int main(){
int t;
scanf("%d",&t);
int kk;
for(kk = 1 ; kk <= t ; ++kk){
// printf("Case %d:",kk);
memset(visited,false,sizeof(visited));
int i;
for(i = 0 ; i < maxn ; ++i){
scanf("%s",&map[i]);
}
bool flag = true;
//判断是否有特定元素处于同一列
int j;
for(i = 0 ; i < maxn ; ++i){
for(j = 0 ; j < maxn ; ++j){
if(map[i][j] == 'Q'){
points[i].x = i;
points[i].y = j;
if(visited[j] == false){
visited[j] = true;
}else{
flag = false;
}
break;
}
}
if(flag == false){
break;
}
}
//判断是否有特定元素处于同一斜线上(这个判断千万不能漏.否则会WA)
if(flag == true){
for(i = 0 ; i < maxn ; ++i){
for(j = i+1 ; j < maxn ; ++j){
if(fabs(points[i].x - points[j].x) == fabs(points[i].y - points[j].y)){
flag = false;
}
}
}
}
if(flag == true){
printf("Case %d: No\n",kk);
}else{
printf("Case %d: Yes\n",kk);
}
}
return 0;
}