在一個n*n的棋盤上面 (參考題目hdu2553)
在 (↖)方向上 列 - 行 的差是相等的
0 1 2 3 4
-1 0 1 2 3
-2 -1 0 1 2
-3 -2 -1 0 1
-4 -3 -2 -1 0
因爲數組的列或行不爲負數,所以要加上n來保證他不是負數
假如我們用數組保存負數肯定是不行的, 所以我們要加上 n,讓他變爲非負.
在 (↗)方向上 列 + 行 的和是相等的
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
看懂了這個規律之後hdu2553這道題目就很好寫了
#include <iostream>
#include <cstring>
using namespace std;
int sum, n;
int visi[3][50];
int ans[15];
void dfs(int line)
{
if(line == n + 1)
{
sum++;
return;
}
for(int i = 1; i <= n; i++)//遍歷所有的列
{
if(!visi[0][i] && !visi[1][line+i] && !visi[2][line-i+n])//遍歷當前的列和兩條對角線所在的位置
{
visi[0][i] = visi[1][line+i] = visi[2][line-i+n] = true;
dfs(line + 1);
visi[0][i] = visi[1][line+i] = visi[2][line-i+n] = false;//記得回溯
}
}
}
int main()
{
for(n = 1; n <= 10; n++)
{
memset(visi, false, sizeof(visi));
sum = 0;
dfs(1);
ans[n] = sum;
}
while(cin >> n && n)
{
cout << ans[n] << endl;
}
return 0;
}