1 条题解
-
0
算法思路
- 初始化棋盘:使用二维数组
da
表示棋盘状态,0表示安全位置,1表示被攻击位置,2表示已有皇后位置。 - 标记威胁区域:对于每个已有皇后,标记其所在行、列和两条对角线上的所有位置为被攻击区域(值为1)。
- 统计已占位置:计算所有被占据或被攻击的位置总数
he
。 - 寻找最佳位置:
- 遍历棋盘上每个未被占据的位置(
da[i][j] != 2
) - 计算在该位置放置新皇后后,新增的被控制的安全位置数量
- 使用map结构记录每个可能控制数量对应的位置
- 遍历棋盘上每个未被占据的位置(
- 输出结果:选择能控制最多安全位置的位置(若有多个,按字典序输出第一个),并输出该数量。
关键点
- 皇后攻击范围:同行、同列、两条对角线
- 位置表示方法:行用字母,列用数字(如"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
- 上传者