UVA1589象棋 解题过程
我确定了一种思路,就是全局考虑,把因为红棋存在而黑棋不能存在的地方在全部标识为1,黑棋可以存在的地方为0,输入黑棋位置后,确认是否有距离为0或1且可以存在的点,这样就很好想了
讲几个需要注意的点
- 要考虑黑棋吃子的情况
- 考虑炮可吃的范围
这是我在uva上的第一个代码,一开始不是很情愿的来到这个专业,觉得自己还是可以学好的,有时候兴趣还是不要发展为职业比较好,职业也可以被我很热爱的呀。
一段漂亮的代码片
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int map[15][15],judgemap[15][15],map1[15][15],jm1[15][15];
int rednum,Y,X;
void check()
{
int i,j,m,n,zt;
for(i=1;i<=10;i++){
for(j=1;j<=9;j++){
if(map[i][j]=='R')
{
for(m=i-1;m>=1;m--)
if(map[m][j]&&map[m][j]!='R') break;
else judgemap[m][j]=1;
for(m=i+1;m<=10;m++)
if(map[m][j]&&map[m][j]!='R') break;
else judgemap[m][j]=1;
for(n=j+1;n<=9;n++)
if(map[i][n]&&map[i][n]!='R') break;
else judgemap[i][n]=1;
for(n=j-1;n>=1;n--)
if(map[i][n]&&map[i][n]!='R') break;
else judgemap[i][n]=1;
}
if(map[i][j]=='C')
{
for(m=i-1;m>=1;m--){
if(map[m][j])
{
for(m=m-1;m>=1&&map[m][j]==0;m--) judgemap[m][j]=1;
break;
}
}
for(m=i+1;m<=10;m++){
if(map[m][j])
{
for(m=m+1;m<=10&&map[m][j]==0;m++) judgemap[m][j]=1;
break;
}
}
for(n=j+1;n<=9;n++){
if(map[i][n])
{
for(n=n+1;n<=9&&map[i][n]==0;n++) judgemap[i][n]=1;
break;
}
}
for(n=j-1;n>=1;n--){
if(map[i][n])
{
for(n=n-1;n>=1&&map[i][n]==0;n--) judgemap[i][n]=1;
break;
}
}
}
if(map[i][j]=='H')
{
if(!map[i+1][j])
{
if(i<=8&&j>=2)judgemap[i+2][j-1]=1;if(i<=8&&j<=8)judgemap[i+2][j+1]=1;
}
if(i>=2&&!map[i-1][j])
{
if(i>=3&&j>=2)judgemap[i-2][j-1]=1;if(i>=3&j<=8)judgemap[i-2][j+1]=1;
}
if(!map[i][j+1])
{
if(j<=7&&i<=9)judgemap[i+1][j+2]=1;if(j<=7&&i>=2)judgemap[i-1][j+2]=1;
}
if(j>=2&&!map[i][j-1])
{
if(j>=3&&i<=9)judgemap[i+1][j-2]=1;if(j>=3&&i>=2)judgemap[i-1][j-2]=1;
}
}
if(map[i][j]=='G')
{
for(m=i-1;m>=1&&map[m][j]==0;m--)
judgemap[m][j]=1;
}
}
}
}
void getinfo()//录入信息
{
int y,x;
while(rednum>=1)
{
char army;
cin>>army>>y>>x;
map[y][x]=army;
judgemap[y][x]=1;
rednum--;
}
}
void print()//用于debug
{
int i,j;
for(i=1;i<=10;i++)
for(j=1;j<=9;j++)
{
if(9-j)printf("%d ",judgemap[i][j]);
else printf("%d \n",judgemap[i][j]);
}
}
void print1()//用于debug
{
int i,j;
for(i=1;i<=10;i++)
for(j=1;j<=9;j++)
{
if(9-j)printf("%c ",!map[i][j]?'0':map[i][j]);
else printf("%c \n",!map[i][j]?'0':map[i][j]);
}
}
int main()
{
int x,y,status;
int p,q;
while(cin>>rednum>>Y>>X&&Y&&X&&rednum)
{
memset(map,0,sizeof(map));
memset(judgemap,0,sizeof(judgemap));
status=0;
getinfo();
memcpy(map1,map,sizeof(map));memcpy(jm1,judgemap,sizeof(judgemap));
for(y=1;y<=3;y++)
{
for(x=4;x<=6;x++)
{
if(((y-Y)*(y-Y)+(X-x)*(X-x)<=1))
{
map[y][x]=0;judgemap[y][x]=0;
check();
for(p=1;p<=3;p++)
{
for(q=4;q<=6;q++)
{
if(judgemap[p][q]==0&&p==y&&q==x)
{
status=1; break;
}
}
if(status) break;
}
memcpy(map,map1,sizeof(map));memcpy(judgemap,jm1,sizeof(jm1));
if(status) break;
}
} if(status) break;
}
printf("%s\n",!status?"YES":"NO");
/* print();
cout<<endl;
print1();
printf("%d %d\n",p,q); */
}
return 0;
}
谢谢大家!
第一次用markdown也不是很熟练