题目:
题目描述
在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; }
(水题 NUPT 1593)8皇后问题(判断是否有元素处于同一行或同一列或同一斜线上)
原文:http://blog.csdn.net/hjd_love_zzt/article/details/44595195