#include <iostream> using namespace std; const int N = 11; char q[N][N];//存储棋盘 bool dg[N * 2], udg[N * 2], cor[N];//点对应的两个斜线以及列上是否有皇后 int n; void dfs(int r) { if(r == n)//放满了棋盘,输出棋盘 { for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) cout << q[i][j]; cout << endl; } cout << endl; return; } for(int i = 0; i < n; i++)//第 r 行,第 i 列 是否放皇后 { if(!cor[i] && !dg[i + r] && !udg[n - i + r])//不冲突,放皇后 { q[r][i] = 'Q'; cor[i] = dg[i + r] = udg[n - i + r] = 1;//对应的 列, 斜线 状态改变 dfs(r + 1);//处理下一行 cor[i] = dg[i + r] = udg[n - i + r] = 0;//恢复现场 q[r][i] = '.'; } } } int main() { cin >> n; for (int i = 0; i < n; i ++ ) for (int j = 0; j < n; j ++ ) q[i][j] = '.'; dfs(0); return 0; } 请问udg[n - i + r]的下标为什么是n-i+r
时间: 2024-04-19 11:23:36 浏览: 20
在这段代码中,`udg`数组用于表示斜线上是否有皇后,其中`udg`数组的下标是由`n - i + r`计算得出的。
这个计算式的目的是将棋盘上的每个点`(r, i)`映射到对应的斜线上。在这里,`r`表示行数,`i`表示列数。对于每个点`(r, i)`,它所在的主对角线的特点是行数与列数之和相等,而副对角线的特点是行数与列数之差相等。
因此,对于主对角线上的点`(r, i)`,它所在的主对角线编号为`i + r`;对于副对角线上的点`(r, i)`,它所在的副对角线编号为`n - i + r`。
因为数组的下标是从0开始计数的,所以需要将副对角线编号加上一个偏移量`n`,才能保证数组下标不会出现负数。
综上所述,`udg[n - i + r]`表示棋盘上点`(r, i)`所在的副对角线上是否有皇后。
相关问题
#include <iostream> using namespace std; int main() {
这是一个C++程序,它的功能是输出一个n*n的矩阵,其中每个元素都是从n*n开始递减1的数字。下面是代码的解释:
```c++
#include <iostream> // 引入iostream库,用于输入输出
#include <iomanip> // 引入iomanip库,用于格式化输出
using namespace std; // 使用std命名空间
int main() { // 主函数
int n,i,k=0; // 定义整型变量n、、k,并初始化k为0
cin>>n; // 从标准输入中读取n的值
for(i=n*n;i>=1;i--) // 循环n*n次,从n*n开始递减1
{
cout<<setw(5)<<i; // 输出当前数字,setw(5)用于设置输出宽度为5
k++; // k加1
if(k%n==0) // 如果k是n的倍数,说明当前行已经输出完毕
cout<<endl; // 输出换行符
}
cout<<endl; // 输出一个额外的换行符
return 0; // 返回0,表示程序正常结束
}
```
#include <iostream> #include <string> #include <stack> #include <vector> #include <iomanip> using namespace std; 逐行注释以上代码
这是一段C++的程序代码,使用了几个标准库的头文件。以下是逐行的注释:
```
#include <iostream> // 输入输出流库头文件
#include <string> // 字符串库头文件
#include <stack> // 栈库头文件
#include <vector> // 向量库头文件
#include <iomanip> // 格式控制库头文件
using namespace std; // 命名空间
```
这段程序代码导入了五个标准库的头文件,分别是iostream、string、stack、vector、iomanip,它们分别用于处理输入输出、字符串、栈、向量和格式控制。其中iostream是C++中最常用的输入输出流库,string是用于字符串操作的库,stack是用于栈数据结构的库,vector是用于动态数组的库,iomanip是用于格式化输出的库。
最后一行代码使用了命名空间std,这意味着所有的标准库函数和变量都在std命名空间中。如果不使用using namespace std,则需要在使用标准库函数时加上std::前缀。