c語言過河卒,c語言過河卒詳細解析

本文目錄一覽:

名稱:馬攔過河卒問題

program ex1(input,output);

const

dx: array[1 .. 8] of Shortint = (-2, -1, 1, 2, 2, 1, -1, -2);

dy: array[1 .. 8] of Shortint = (1, 2, 2, 1, -1, -2, -2, -1);

var

n, m, x, y, i, j: Byte;

g: array[0 .. 20, 0 .. 20] of Byte;

f: array[0 .. 20, 0 .. 20] of Comp;

begin

Readln(n, m, x, y);

Fillchar(g, Sizeof(g), 0);

g[x, y] := 1;

for i := 1 to 8 do

if (x + dx[i] = 0) and (x + dx[i] = n) and

(y + dy[i] = 0) and (y + dy[i] = m) then

g[x + dx[i], y + dy[i]] := 1;

f[0, 0] := 1;

for i := 1 to n do

if g[i, 0] = 0 then f[i, 0] := f[i – 1, 0];

for i := 1 to m do

if g[0, i] = 0 then f[0, i] := f[0, i – 1];

for i := 1 to n do

for j := 1 to m do

if g[i, j] = 0 then f[i, j] := f[i – 1, j] + f[i, j – 1];

Writeln(f[n, m]: 0: 0)

end.

我不會C,自己看了後改吧

簡單過河卒問題

/*

A點有一個卒,需要走到目標B點。行走規則:可以向下(共4步)或者向右(共8步)。

要求計算從A能夠到達B的路徑的條數,並輸出每一條路徑.

解:

題目描述的是一種在二維空間中情形。設 X 軸為從左到右,Y軸為從上到下。

有 A 和 B 兩點,第 1 維(X軸)距離d[1]=8,第 2 維(Y軸)距離 d[2]=8,

因此沿着點A到點B的向量為(8,4) 。每次沿着向量的一個方向(X軸或Y軸)運動一個單位,

也就是每次可以移到(1,0)或者(0,1)。計算從A到達B的路徑條數。

一般的情形是:

在 D 維空間中,有A,B兩點,

這兩點在第 1 維距離d[1],第 2 維距離d[2],…,第D維的距離d[D],

因此沿着點A到點B的向量為(d[1],d[2],…,d[D])。每次沿着向量的一個方向運動一個單位,

也就是每次可以移動(±1,0,…,0)或者(0,±1,…,0),…,或者(0,0,…,±1),

這裡的第 i 個 ±1,實際只能取+1或者-1,具體正負性和相應的 d[i] 一樣。

計算從A到達B的路徑條數。

解決的方案:

我們針對題目描述的二維空間的情形進行分析。

點A到點B的向量為(8,4) 定下來後,因為每次只能沿着向量的一個方向(X軸或Y軸)運動一個單位,

而這兩個方向是正交的,也就是互不影響的。

不管先走X方向,還是先走Y方向, 最後都一定是向X方向走 8 步,向 Y 方向走 4 步。

假設開始沿 X 方向運動一個單位,我們假設到達了點 A’ 。

那麼點 A’ 到點 B 的向量為(7,4) ,下面問題就是計算 A’ 到達 B 的路徑條數。

可以發現,問題“計算 A 到達 B 的路徑條數”和問題“計算 A 到達 B 的路徑條數”是同一類問題。

假設開始沿 Y 方向運動一個單位,我們假設到達了點 A” 。

那麼點 A” 到點 B 的向量為(8,3) ,下面問題就是計算 A” 到達 B 的路徑條數。

可以發現,問題“計算 A 到達 B 的路徑條數”和問題“計算 A” 到達 B 的路徑條數”是同一類問題。

通過上面的兩個假設可以發現,不管第一步怎麼走,接下來都產生了一個相似的子問題。

這就是分治的策略,也就是把一個大問題,分解成若干個相似的子問題。

上面的兩個假設,最後的一個子問題必定是某點到 B 的向量為(1,0),

或者某點到 B 的向量為(0,1),這是能立即解決的子問題。

*/

#include stdio.h

#include stdlib.h

// 當前需要的維度,可以修改這個值進行擴展(不用改動算法)

#define DIMENSION 2

// 每個維度的最大長度

#define MAX_LENGTH_PER_DIMENSION 100

// 空間最小的移動向量。一次只能在一個維度移動一個單位。

struct Step

{

// 維度索引

int index;

// 移動距離

int d;

};

/*

根據向量距離 distance ,計算每個維度上的最小移動單位。

通過 steps 和 stepsAmount 返回。

注意:如果向量距離某個維度上的的距離為 0 ,那麼這個維度上不會返回最小移動單位。

*/

void getSteps(int distance[],struct Step steps[],int *stepsAmount)

{

int i;

*stepsAmount=0;

for(i=0;iDIMENSION;i++)

{

// 在維度 i 上距離不為 0 ,需要計算最小移動單位

if(distance[i] != 0)

{

steps[*stepsAmount].index = i;

steps[*stepsAmount].d = distance[i]0 ? 1 : -1;

(*stepsAmount) ++;

}

}

}

// 打印最小移動單位

void printStep(const struct Step* step)

{

int i;

// 對於小於等於二維的坐標系,可以為每一步指定上下左右四個方向

if(DIMENSION = 2)

{

if(step-index == 0)

{

if(step-d 0)

printf(“右”);

else

printf(“左”);

}

else if(step-index == 1)

{

if(step-d 0)

printf(“下”);

else

printf(“上”);

}

}

// 對於大於二維的坐標系,直接輸出移動向量。

else

{

printf(“[“);

for(i=0;iDIMENSION;i++)

{

printf(“%d”,i==step-index ? step-d : 0);

if(i != DIMENSION-1)

printf(“,”);

}

printf(“]”);

}

}

void getPath(int distance[],

struct Step path[],int pathLength,int *totalSchemeAmount)

{

int i,j,k,d;

struct Step steps[DIMENSION];

int stepsAmount;

// 計算需要移動的總距離

for(i=0,d=0;iDIMENSION;i++)

d += abs(distance[i]);

if(d == 0)

{// 已經走完全程,輸出路徑

for(i=0;ipathLength;i++)

{

printStep(path[i]);

if(i!=(pathLength-1))

printf(” == “);

else

printf(“\n”);

}

// 統計路徑條數

(*totalSchemeAmount) ++;

}

else

{

// 獲取最小移動單位

getSteps(distance,steps,stepsAmount);

for(i=0;istepsAmount;i++)

{

// 任選一個維度,運動一個最小單位

path[pathLength++] = steps[i];

distance[steps[i].index] -= steps[i].d;

// 解決成子問題

getPath(distance,path,pathLength,totalSchemeAmount);

// 回溯

pathLength–;

distance[steps[i].index] += steps[i].d;

}

}

}

int main(int argc, char *argv[])

{

/* DIMENSION = 1 */

//int distance[DIMENSION]={-5};

/* DIMENSION = 2 */

int distance[DIMENSION]={8,4};

/* DIMENSION = 3 */

//int distance[DIMENSION]={1,1,1};

struct Step steps[DIMENSION],path[DIMENSION*MAX_LENGTH_PER_DIMENSION];

int stepsAmount,totalSchemeAmount=0;

// 計算路徑

getPath(distance,path,0,totalSchemeAmount);

printf(“一共 %d 條路徑。\n”,totalSchemeAmount);

return 0;

}

C語言 馬攔過河卒 我想用 二維數組遞推出來。。為什麼提交上就是不對呢?

看了這個題,怎麼感覺我的問題比你的還要多呢,

1.a b c d 輸入的分別是什麼?

2.棋盤上的0和1分別代表什麼?

3.棋盤未初始化,你知道那些未被賦值的格格都是些什麼值嗎?數組p[][]為什麼不給初始化呢?

4.每一個語句都語法不錯,都簡單之極,就是組合起來不知所謂,可以加點注釋解釋一下嗎?應用是什麼規則? 我讀了N遍還是不理解你在做什麼

c++馬攔過河卒

#includeiostream

using namespace std;

int const Max = 16;

int dir[][2] = { { 1, 0 }, { 0, 1 } } ;

int dp[Max][Max] = { 0 };

int k = 0; //計數器

struct Point {

    int x, y;

};

Point b, horse;

bool onboard(int x, int y) {

    return x=0  xMax  y=0  yMax;

}

void on(int x, int y) //將馬附近的坐標記作1

{

    if(onboard(x,y)) dp[x][y] = 1;

    if(onboard(x-2,y-1)) dp[x – 2][y – 1] = 1;

    if(onboard(x-2,y+1)) dp[x – 2][y + 1] = 1;

    if(onboard(x+2,y-1)) dp[x + 2][y – 1] = 1;

    if(onboard(x+2,y+1)) dp[x + 2][y + 1] = 1;

    if(onboard(x-1,y-2)) dp[x – 1][y – 2] = 1;

    if(onboard(x-1,y+2)) dp[x – 1][y + 2] = 1;

    if(onboard(x+1,y-2)) dp[x + 1][y – 2] = 1;

    if(onboard(x+1,y+2)) dp[x + 1][y + 2] = 1;

}

void dfs(int x, int y) {

    if(x  b.x || y  b.y) return; // 如果提速,加上這行

    if (x == b.x  y == b.y) {

        ++k;

        return;

    }

    for (int i = 0; i  2; i++) {

        int IX = x + dir[i][0];

        int IY = y + dir[i][1];

        if (onboard(IX, IY)) {

            if (dp[IX][IY] == 0) {

                dfs(IX, IY);

            }

        }

    }

}

int main() {

    cin  b.x  b.y  horse.x  horse.y;

    on(horse.x, horse.y);

    dfs(0, 0);

    cout  k;

}

#includeiostream

using namespace std;

int const Max = 16;

int const dir[][2] = { { 1, 0 }, { 0, 1 } } ;

int dp[Max][Max] = { 0 };

int k = 0; //計數器

struct Point {

    int x, y;

};

Point b, horse;

bool onboard(Point p) {

    return p.x=0  p.xMax  p.y=0  p.yMax;

}

void on(Point p) //將馬附近的坐標記作1

{

    int x = p.x, y = p.y;

    if(onboard({x,y})) dp[x][y] = 1;

    if(onboard({x-2,y-1})) dp[x – 2][y – 1] = 1;

    if(onboard({x-2,y+1})) dp[x – 2][y + 1] = 1;

    if(onboard({x+2,y-1})) dp[x + 2][y – 1] = 1;

    if(onboard({x+2,y+1})) dp[x + 2][y + 1] = 1;

    if(onboard({x-1,y-2})) dp[x – 1][y – 2] = 1;

    if(onboard({x-1,y+2})) dp[x – 1][y + 2] = 1;

    if(onboard({x+1,y-2})) dp[x + 1][y – 2] = 1;

    if(onboard({x+1,y+2})) dp[x + 1][y + 2] = 1;

}

void dfs(Point current) {

    int x = current.x, y = current.y;

    if(x  b.x || y  b.y) return; // 如果提速,加上這行

    if (x == b.x  y == b.y) {

        ++k;

        return;

    }

    for (int i = 0; i  2; i++) {

        int IX = x + dir[i][0];

        int IY = y + dir[i][1];

        if (onboard({IX, IY})) {

            if (dp[IX][IY] == 0) {

                dfs({IX, IY});

            }

        }

    }

}

int main() {

    cin  b.x  b.y  horse.x  horse.y;

    on(horse);

    dfs({0, 0});

    cout  k;

}

C語言遞推例題過河卒,樣例輸入6 6 3 2,樣例輸出17,幫我看看我程序的問題,答案錯誤。

對第一行或者第一列的初始化值不能簡單的全部初始化為1。

比如說樣例中的馬的位置是在(3,2)所以(2,0)這個點是不可達的。由於卒只能向下和向右走,(2,0)之下的所有的點都是不可達的。所以你的答案會錯。

int main()

{

int n,m,x,y,i,j,t,h,l;

long long a[100][100],b[100][100];

scanf(“%d%d%d%d”,n,m,x,y);

for(i=0; i=n; i++)

{

for(j=0; j=m; j++)

{

if((i==xj==y)||(i==x-2j==y-1)||(i==x-2j==y+1)||(i==x-1j==y-2)||(i==x-1j==y+2)||(i==x+1j==y-2)||(i==x+1j==y+2)||(i==x+2j==y-1)||(i==x+2j==y+1))

{

b[i][j]=0;

}

else

{

b[i][j]=1;

}

}

}

for(h=0; h=n; h++)

{

for(l=0; l=m; l++)

{

if(b[h][l]==1)

{

if(h==0 l==0)

a[h][l]=1;

else if(h == 0)

a[h][l] = a[h][l-1];

else if(l == 0)

a[h][l] = a[h-1][l];

else

a[h][l]=a[h][l-1]+a[h-1][l];

}

else

a[h][l]=0;

}

}

printf(“%d”,a[n][m]);

return 0;

}

馬攔過河卒 C語言

把下面這段檢查下,x-1,x-2,y-1,y-2是否有越界?

map[x][y]=0; map[x-1][y-2]=0; map[x-1][y+2]=0; map[x+1][y-2]=0; map[x+1][y+2]=0; map[x-2][y-1]=0; map[x-2][y+1]=0; map[x+2][y-1]=0; map[x+2][y+1]=0;

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/186618.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-27 05:47
下一篇 2024-11-27 05:47

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論