N皇后(回溯)



Problem 4: N皇后


Time Limit:1 Ms| Memory Limit:128 MB
Difficulty:3

Description

檢查一個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行、每列只有一個,每條對角線(包括兩條主對角線的所有平行線)上至多有一個棋子。 

列號
  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

一個數字N (6 <= N <= 13) 表示棋盤是N x N大小的。 

Output

前三行爲前三個解,每個解的兩個數字之間用一個空格隔開。第四行只有一個數字,表示解的總數。 

Sample Input

6

Sample Output

2 4 6 1 3 5 
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;
 			}
		}
	}
}





發佈了50 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章