1 条题解

  • 0
    @ 2025-5-27 22:32:45

    算法思路

    1. 初始化棋盘:使用二维数组da表示棋盘状态,0表示安全位置,1表示被攻击位置,2表示已有皇后位置。
    2. 标记威胁区域:对于每个已有皇后,标记其所在行、列和两条对角线上的所有位置为被攻击区域(值为1)。
    3. 统计已占位置:计算所有被占据或被攻击的位置总数he
    4. 寻找最佳位置
      • 遍历棋盘上每个未被占据的位置(da[i][j] != 2
      • 计算在该位置放置新皇后后,新增的被控制的安全位置数量
      • 使用map结构记录每个可能控制数量对应的位置
    5. 输出结果:选择能控制最多安全位置的位置(若有多个,按字典序输出第一个),并输出该数量。

    关键点

    • 皇后攻击范围:同行、同列、两条对角线
    • 位置表示方法:行用字母,列用数字(如"a1"、"b12")
    • 最佳位置选择标准:能控制最多未被占据的安全位置

    复杂度分析

    • 时间复杂度:O(KNM + NMN*M),其中K是皇后数量,N和M是棋盘尺寸
    • 空间复杂度:O(N*M + K),用于存储棋盘状态和位置映射
    #include <iostream>
    #include <map>
    #include <vector>
    #include <string>
    #include <algorithm>
    using namespace std;
    int da[30][30];
    map<int,vector<string> > mp; 
    int main()
    {
    	int N,M,K;
    	cin>>N>>M>>K;
    	for(int i=0;i<K;i++)
    	{
    		string s;
    		cin>>s; 
    		int x=s[0]-'a';
    		int y=s[1]-'0';
    		if(s.size()==3)
    		{
    			y=y*10+s[2]-'0';
    		}
    		y=y-1;
    		da[x][y]=2;
    		for(int j=0;j<N;j++)
    		{
    			for(int k=0;k<M;k++)
    			{
    				if(da[j][k]!=2)
    				{
    					if(j==x || k==y || (j-k)==(x-y) || (j+k)==(x+y))
    					{
    						da[j][k]=1;
    					}
    				}
    			}
    		}
    	}
    	int he=0;
    	for(int i=0;i<N;i++)
    	{
    		for(int j=0;j<M;j++)
    		{
    			if(da[i][j]==1 || da[i][j]==2)
    			{
    				he++;
    			}
    		}
    	}
    	//cout<<he<<endl;
    	for(int i=0;i<N;i++)
    	{
    		for(int j=0;j<M;j++)
    		{
    			if(da[i][j]!=2)
    			{
    				string s="";
    				s=s+(char)(i+'a');
    				if((j+1)>9)
    				{
    					s=s+(char)((j+1)/10+'0');
    				}
    				s=s+(char)((j+1)%10+'0');
    				int js=0;
    				for(int k=0;k<N;k++)
    				{
    					for(int l=0;l<M;l++)
    					{
    						if(da[k][l]==0)
    						{
    							if(i==k || j==l || (i-j)==(k-l) || (i+j)==(k+l))
    							{
    								js++;
    							}
    						}
    					}
    				}
    				mp[N*M-he-js].push_back(s);				
    			}
    		}
    	}
    	sort(mp.rbegin()->second.begin(),mp.rbegin()->second.end());
    	cout<<mp.rbegin()->second[0]<<endl;
    	cout<<mp.rbegin()->first<<endl;
    	return 0;
    } 
    
    • 1

    信息

    ID
    2403
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者