題目:(傳送門)
給出乙個象棋的殘局,下一步是黑棋走,判斷黑棋是不是被將死。
思路:
讀完這個題,知道是乙個模擬題,然後想到用兩個二維陣列來模擬棋盤,乙個(mp陣列)用來存殘局,乙個(res陣列)用來處理紅棋在棋盤上產生的對黑棋的限制。
將紅棋的馬、車、炮、將寫成函式來分別處理。這樣處理完之後,判斷一下黑棋的四周是不是有可以走的格仔,有的話不是將死,沒有的是就是被將死了。
1、可以將車和將寫成乙個函式來處理,這裡可以標記與棋子處於同一行和同一列中的格仔,如下圖:
紅色圈出來的部分不能走,注意馬上邊的格仔是可以走的,而如果和車一行的只有對方的將,那麼這一行都不能走。
2、對馬的處理,如下圖:
同理,紅色的部分不能走,注意馬有蹩腿的情況出現如上右圖
3、對炮棋的處理最為複雜,具體情況如圖:
如上右圖中綠色的部分是可以走的,左圖中的紅色部分是不可以走的。
**:(略長)
#include #define inf 0x3f3f3f3fview code#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;
}
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 列與行的情況是相同的。考慮對角線,如圖,從左到右對角線的長...