測試資料只有一行,有兩個數字 n 及 m, 表示棋盤大小為 n × m, 其中 1 ≤ n ≤ 8,1 ≤ m ≤ 8 且 n × m ≤ 42。 這兩個數字之間用空格(white space)隔開。
範例輸入一: 3 5
範例輸入二: 4 3
輸出
輸出資料為一個正整數,表示一開始在左上角的炮能吃到最多顆卒的數目。
範例輸出一: 7
範例輸出二: 5
解題思路
依照題意使用 DFS 列舉所有可能性後輸出最大值即可。
完整程式碼
AC (0.1s, 104KB)
#include<stdio.h> #include<memory.h>
int n, m, best; char table[10][10];
voidserch(int x, int y, int cont) { if (cont > best) best = cont; int i; table[x][y] = 0; for (i = x + 1; i < n && !table[i][y]; ++i) ; while (++i < n) { if (table[i][y]) { serch(i, y, cont + 1); break; } } for (i = x - 1; ~i && !table[i][y]; --i) ; while (--i >= 0) { if (table[i][y]) { serch(i, y, cont + 1); break; } } for (i = y + 1; i < m && !table[x][i]; ++i) ; while (++i < m) { if (table[x][i]) { serch(x, i, cont + 1); break; } } for (i = y - 1; ~i && !table[x][i]; --i) ; while (--i >= 0) { if (table[x][i]) { serch(x, i, cont + 1); break; } } table[x][y] = 1; }
intmain() { scanf(" %d %d", &n, &m); for (int i = 0; i < n; ++i) memset(table[i], 1, m); serch(0, 0, 0); printf("%d\n", best); return0; }