回溯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号