Problem 4: N皇后
Time Limit:1 Ms| Memory Limit:128 MB
Difficulty:3
Description
列號
1 2 3 4 5 6
-------------------------
1 | | O | | | | |
-------------------------
2 | | | | O | | |
-------------------------
3 | | | | | | O |
-------------------------
4 | O | | | | | |
-------------------------
5 | | | O | | | |
-------------------------
6 | | | | | O | |
-------------------------
上面的佈局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有一個棋子,如下:
行號 1 2 3 4 5 6
列號 2 4 6 1 3 5
這只是跳棋放置的一個解。請編一個程序找出所有跳棋放置的解。並把它們以上面的序列方法輸出。解按字典順序排列。請輸出前3個解。最後一行是解的總個數。
Input
Output
Sample Input
Sample Output
3 6 2 5 1 4
4 1 5 2 6 3
4
代碼
#include<stdio.h>
int count = 0, n;
int vis[3][30];
int c[20];
void search(int n);
int main()
{
int ;
scanf("%d", &n);
search(1);
printf("%d\n", count);
return 0;
}
void search(int cur)
{
int i;
if(cur > n )
{
count++;
if(count < 4)
{
for(i = 1; i < n; i++)
printf("%d ", c[i]);
printf("%d\n", c[i]);
// printf("\n");
}
}
else
{
for(i = 1; i <= n; i++)
{
if(!vis[0][i] && !vis[1][cur + i] && !vis[2][cur - i + n]) //在沒有被標記且滿足條件時(只要判斷同列和對角線即可)
{
c[cur] = i; //下面三行進行標記
vis[0][i] = 1;
vis[1][cur + i] = 1;
vis[2][cur - i + n] = 1;
search(cur + 1);
vis[0][i] = 0; //返回時, 注意變回到沒有被標記的狀態
vis[1][cur + i] = 0;
vis[2][cur - i + n] = 0;
}
}
}
}