回溯2-围棋问题
题目在此链接https://www.luogu.com.cn/problem/U263569?contestId=92411
Answer:
#include <stdio.h>
#include <stdlib.h>
#define MOD 100000000
#define MAX 20
int sum = 0;
int row, column;
int board[MAX][MAX];
void put_chess(int x, int y);
int main()
{
	scanf("%d %d", &row, &column);
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < column; j++)
		{
			int temp;
			scanf("%d", &temp);
			board[i][j] = temp - 1;
			// 可放置棋子的位置赋值为0, 不可放置的位置赋值为-1
		}
	}
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < column; j++)
		{
			if (board[i][j] == 0)
				put_chess(i, j);
		}
	}
	printf("%d\n", sum);
	system("pause");
	return 0;
}
// 进入,计数器加一并取模, 将当前位置和上下左右相邻位置赋值为1, 继续向后搜索赋值为0的位置
// 搜索结束,将先前赋值为1的当前位置和相邻位置还原为0
void put_chess(int x, int y)
{
	sum++;
	sum %= MOD;
	board[x][y] = 1;
	if (x - 1 >= 0 && board[x - 1][y] == 0)
		board[x - 1][y] = 1;
	if (x + 1 < row && board[x + 1][y] == 0)
		board[x + 1][y] = 1;
	if (y - 1 >= 0 && board[x][y - 1] == 0)
		board[x][y - 1] = 1;
	if (y + 1 < column && board[x][y + 1] == 0)
		board[x][y + 1] = 1;
	for (int i = x; i < row; i++)
	{
		for (int j = 0; j < column; j++)
		{
			if (i == x && j <= y)
				break;
			if (board[i][j] == 0)
				put_chess(i, j);
		}
	}
	board[x][y] = 0;
	if (x - 1 >= 0 && board[x - 1][y] == 1)
		board[x - 1][y] = 0;
	if (x + 1 < row && board[x + 1][y] == 1)
		board[x + 1][y] = 0;
	if (y - 1 >= 0 && board[x][y - 1] == 1)
		board[x][y - 1] = 0;
	if (y + 1 < column && board[x][y + 1] == 1)
		board[x][y + 1] = 0;
	return;
}
                    
                
                
            
        
浙公网安备 33010602011771号