1 条题解

  • 0
    @ 2026-8-6 15:26:02

    前言

    众所不周知,这是我的第二篇(第一篇?)题解。

    然而众所又不周知,这棋子为什么能吃自己呢……


    思路

    这道题我的想法就是使用广搜 (但不完全是广搜) 大法,定义一个变量 mapsmaps 当作棋盘, mapsi,jmaps_{i,j} 表示第 ii 行第 jj 列上的格子有没有被别的棋子吃过(吃过了就不能再算一遍了),然后将没有被吃过且能吃到的加入累加器 sumsum 中去,最后计算共有几个满足这样条件的格子即可。


    坑点

    棋盘最左上角的点坐标是 1,11,1 不是 0,00,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
    上传者