1 条题解
-
0
前言
众所不周知,这是我的
第二篇(第一篇?)题解。然而众所又不周知,这棋子为什么能吃自己呢……
思路
这道题我的想法就是使用广搜
(但不完全是广搜)大法,定义一个变量 当作棋盘, 表示第 行第 列上的格子有没有被别的棋子吃过(吃过了就不能再算一遍了),然后将没有被吃过且能吃到的加入累加器 中去,最后计算共有几个满足这样条件的格子即可。
坑点
棋盘最左上角的点坐标是 不是 。
代码(含注释)
(主要思路及细节已注释)
#include <bits/stdc++.h> using namespace std; struct node{ char c;//棋子的种类 int x,y;//棋子的位置 }; node a[40001];//棋子 int maps[201][201];//棋盘 int dirn[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{-1,2},{1,-2},{-1,-2}};//骑士可以攻击的8个方向 int dirr[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//车可以攻击的4个方向 int dirq[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};//皇后可以攻击的8个方向 int main(){ int n,m;//根据题意 int sum=0;//表示能被攻击到的格子个数 cin>>n>>m; for(int i=0;i<m;i++){ cin>>a[i].c >>a[i].x >>a[i].y ; if(maps[a[i].x][a[i].y]==0){//该位置没有被别的棋子攻击过 maps[a[i].x][a[i].y]=1;//攻击自己 sum++;//增加一个可被攻击的格子 } if(a[i].c=='N'){//马部分 for(int j=0;j<8;j++){//8个方向 int nx=a[i].x +dirn[j][0]; int ny=a[i].y +dirn[j][1]; //马下一步攻击到的位置 if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&maps[nx][ny]==0){//没有出界且没被攻击过,注意棋盘最左上角的点坐标是1,1不是0,0 maps[nx][ny]=1;//攻击这个格子 sum++;//增加一个可被攻击的格子 } } }else if(a[i].c=='R'){//车部分 for(int j=0;j<4;j++){//4个方向 int nx=a[i].x +dirr[j][0]; int ny=a[i].y +dirr[j][1]; //车下一步攻击到的位置 while(nx>=1&&nx<=n&&ny>=1&&ny<=n){//注意,车能攻击这个方向一直到棋盘边界的位置,要用while循环,其余同马部分 if(maps[nx][ny]==0){//同马部分 maps[nx][ny]=1;//同马部分 sum++;//同马部分 } nx+=dirr[j][0]; ny+=dirr[j][1]; //由于车能一直攻击直到这个方向的边界点,所以x,y坐标要移动 } } }else{//皇后部分 for(int j=0;j<8;j++){//8个方向 int nx=a[i].x +dirq[j][0]; int ny=a[i].y +dirq[j][1]; //皇后下一步攻击到的位置 while(nx>=1&&nx<=n&&ny>=1&&ny<=n){//注意,皇后能攻击这个方向一直到棋盘边界的位置,要用while循环,其余同马部分 if(maps[nx][ny]==0){//同马部分 maps[nx][ny]=1;//同马部分 sum++;//同马部分 } nx+=dirq[j][0]; ny+=dirq[j][1]; //由于皇后能一直攻击直到这个方向的边界点,所以x,y坐标要移动 } } } } cout<<sum<<endl;//输出结果 return 0;//完美的结束 }最后,AC 记录。
- 1
信息
- ID
- 12562
- 时间
- 3000ms
- 内存
- 600MiB
- 难度
- 5
- 标签
- 递交数
- 53
- 已通过
- 20
- 上传者