UVA 1589 象棋(模擬)

2022-07-25 08:36:08 字數 3117 閱讀 9832

題目:(傳送門)

給出乙個象棋的殘局,下一步是黑棋走,判斷黑棋是不是被將死。

思路:

讀完這個題,知道是乙個模擬題,然後想到用兩個二維陣列來模擬棋盤,乙個(mp陣列)用來存殘局,乙個(res陣列)用來處理紅棋在棋盤上產生的對黑棋的限制。

將紅棋的馬、車、炮、將寫成函式來分別處理。這樣處理完之後,判斷一下黑棋的四周是不是有可以走的格仔,有的話不是將死,沒有的是就是被將死了。

1、可以將車和將寫成乙個函式來處理,這裡可以標記與棋子處於同一行和同一列中的格仔,如下圖:

紅色圈出來的部分不能走,注意馬上邊的格仔是可以走的,而如果和車一行的只有對方的將,那麼這一行都不能走。

2、對馬的處理,如下圖:

同理,紅色的部分不能走,注意馬有蹩腿的情況出現如上右圖

3、對炮棋的處理最為複雜,具體情況如圖:

如上右圖中綠色的部分是可以走的,左圖中的紅色部分是不可以走的。

**:(略長)

#include #define inf 0x3f3f3f3f

#define max 1e9;

#define fre() freopen("in.txt","r",stdin)

#define fro() freopen("out.txt","w",stdout)

using

namespace

std;

typedef

long

long

ll;typedef pair

p;const

int maxn = 200000;//

g-general-1 r-chariot-2 c-cannon-3 h-horse-4 black-5

mapkey;

int mp[11][10],res[11][10

];int

n,bx,by;

struct

tt[10

];bool isin(int x,int y)

return

false;}

void makegr(int x,int y)

}for(int i = x+1; i<=3; i++)

}for(int i = y-1; i>=1; i--)

}for(int i = y+1; i<=9; i++) }}

}void makeh(int x,int y)

if(isin(x-2,y+1) && mp[x-1][y]==0

)

if(isin(x+2,y-1) && mp[x+1][y]==0)

if(isin(x+2,y+1) && mp[x+1][y]==0

)

if(isin(x-1,y-2) && mp[x][y-1]==0)

if(isin(x+1,y-2) && mp[x][y-1]==0

)

if(isin(x-1,y+2) && mp[x][y+1]==0)

if(isin(x+1,y+2) && mp[x][y+1]==0)}

void makec(int x,int y)

}int tx=0,ty=0

;

for(int i = x-1; i>=1; i--)

if(isin(i,y) && mp[i][y]=='b'

)

return

; }

//<=1; i--)

if(isin(i,y) && mp[i][y]!=0 && mp[i][y]!='b')

}for(int i=y-1; i>=1; i--)

if(isin(x,i) && mp[x][i]=='b'

) }

for(int i=ty-1; i>=1; i--)

if(isin(x,i) && mp[x][i]==0 && mp[x][i]!='b'

) }

for(int i = y+1; i<=9; i++)

if(isin(x,i) && mp[x][i]=='b'

) }

for(int i = y+1; i<=9; i++)

if(isin(x,i) && mp[x][i]==0 && mp[x][i]!='b'

) }

}bool

in(int x,int y)

return

false;}

bool judge(int x,int y)

void

check1()

printf("\n

");}

} void

check2()

printf("\n

");}

}int

main()

mp[bx][by] = 'b'

;

char

ch;

intrx,ry;

for(int i = 0; i) ;

}for(int i = 0; i)

else

if(ch=='h'

)

else

if(ch=='c'

) }

//check2();

//cout/

check1();

if(judge(bx,by))

else

}return0;

}

view code

UVA1589象棋 解題過程

我確定了一種思路,就是全域性考慮,把因為紅棋存在而黑棋不能存在的地方在全部標識為1,黑棋可以存在的地方為0,輸入黑棋位置後,確認是否有距離為0或1且可以存在的點,這樣就很好想了 講幾個需要注意的點 這是我在uva上的第乙個 一開始不是很情願的來到這個專業,覺得自己還是可以學好的,有時候興趣還是不要發...

UVA 1589 Xiangqi(挖坑待填)

題目無力了,noip考完心力憔悴,想隨便切道題卻碼了250line,而且還是錯的,知道自己 錯了,但特殊情況判起來太煩了,唯一選擇是重構,我卻沒有這勇氣。有空再寫吧,最近真的快瘋了。include int main else printf ac n n n return 0 include char...

UVa 11538 象棋中的皇后

題意 n m的棋盤,有多少種方法放置兩個相互攻擊的皇后?思路 這兩個皇后互相攻擊的方式只有3種,在同一行,在同一列,或在同一對角線。因為每種情況沒有交集,所以可以用加法原理。先考慮同一行,每一行都有 種放法,共有n行,所以就是n m m 1 列與行的情況是相同的。考慮對角線,如圖,從左到右對角線的長...