问题是:有2匹马,白色和黑色,它们的运动方式像普通象棋中的马一样。我们的目标是找出黑白马是否可以相遇(位置相同)。每匹马的活动范围将受到限制。
-用户首先必须输入测试用例的数量。
-第二个用户输入是黑马ex:A1的起始坐标和白马ex:H8的起始坐标。
-最终用户输入是每匹马移动的限制。例如,如果用户输入3,则每个黑白马都有3次移动的机会。
-输出为“ YES”或“ NO” >>>>如果黑白相符,则为是,否则,则为NO]
我被要求用递归解决这个问题,但是我被困住了。
这里是一些示例:
输入:
2
(案件数量)A1 H8
(坐标)3
(限位动作)A1 H8
(第二种情况的坐标)1
(第二种情况的极限移动)输出:
案例1:是
案例#2:否
谁能发现问题或逻辑缺陷。.>
#include <stdio.h> int counter=0; int count[10][10] = {{}}; void moveblack(int black_x,int black_y,int limitblack,int map[10][10],int limit){ // printf("\n%d,%d\n",black_x,black_y); // printf("\n%d\n",limitblack); // limitblack++; if(limitblack > limit){ limitblack =0; return; } count[black_y][black_x]++; map[black_y][black_x] = 1; if(black_x > 8 || black_y > 8 || black_x < 1 || black_y < 1){ return; } else{ //BLACK MOVE if(map[black_y+2][black_x+1] == 0){ moveblack(black_x+1,black_y+2,limitblack+1,map,limit); } if(map[black_y+2][black_x-1] == 0){ moveblack(black_x-1,black_y+2,limitblack+1,map,limit); } if(map[black_y-2][black_x+1] == 0){ moveblack(black_x+1,black_y-2,limitblack+1,map,limit); } if(map[black_y-2][black_x-1] == 0){ moveblack(black_x-1,black_y-2,limitblack+1,map,limit); } if(map[black_y+1][black_x+2] == 0){ moveblack(black_x+2,black_y+1,limitblack+1,map,limit); } if(map[black_y+1][black_x-2] == 0) { moveblack(black_x-2,black_y+1,limitblack+1,map,limit); } if(map[black_y-1][black_x+2] == 0){ moveblack(black_x+2,black_y-1,limitblack+1,map,limit); } if(map[black_y-1][black_x-2] == 0){ moveblack(black_x-2,black_y-1,limitblack+1,map,limit); } } } void movewhite(int white_x, int white_y,int limitwhite,int map[10][10],int limit){ // limitwhite++; count[white_y][white_x]++; map[white_y][white_x] = 1; if(white_x > 8 || white_y > 8 || white_x < 1 || white_y < 1 ){ return; } if(limitwhite > limit){ limitwhite =0; return; } else{ //WHITE MOVE if(map[white_y+2][white_x+1]==0){ movewhite(white_x+1,white_y+2,limitwhite+1,map,limit); } if(map[white_y+2][white_x-1]==0){ movewhite(white_x-1,white_y+2,limitwhite+1,map,limit); } if(map[white_y-2][white_x+1]==0){ movewhite(white_x+1,white_y-2,limitwhite+1,map,limit); } if(map[white_y-2][white_x-1]==0){ movewhite(white_x-1,white_y-2,limitwhite+1,map,limit); } if(map[white_y+1][white_x+2]==0){ movewhite(white_x+2,white_y+1,limitwhite+1,map,limit); } if(map[white_y+1][white_x-2]==0){ movewhite(white_x-2,white_y+1,limitwhite+1,map,limit); } if(map[white_y-1][white_x+2]==0){ movewhite(white_x+2,white_y-1,limitwhite+1,map,limit); } if(map[white_y-1][white_x-2]==0){ movewhite(white_x-2,white_y-1,limitwhite+1,map,limit); } } } int main() { int tc; scanf("%d",&tc); // amount of test case for(int t=1;t<=tc;t++){ int limit,map[10][10]={{}}; scanf("%d",&limit); // amount of limit each horse have int limitblack = 0, limitwhite = 0; char black[3],white[3]; int black1,white1; int black_x,black_y,white_x,white_y; getchar(); scanf("%s %s",&black,&white); //coordinates ex A1 H8 or G6 B5 black_x = black[0] - ('A'-1); // scale 1-8 // printf("\n%d\n",black_x); black_y = (black[1]-'0'); // printf("\n%d\n",black_y); white_x = white[0] - ('A'-1); // scale 1-8 white_y = (white[1]-'0'); // printf("%d,%d\n",black_x,black_y); // printf("%d,%d\n",white_x,white_y); //Set Chess board as 0, prevent revisiting in recursion for(int i=8;i>=1;i--){ for(int j=1;j<=8;j++){ map[i][j] = 0; } } //CHECK // for(int i=8;i>=1;i--){ // for(int j=1;j<=8;j++){ // if(i==black_x && j==black_y){ // printf("B"); // } // else if(i==white_x && j==white_y){ // printf("W"); // } else { // printf("%d",map[i][j]); // } // // } // printf("\n"); // } moveblack(black_x,black_y,limitblack,map,limit); movewhite(white_x,white_y,limitwhite,map,limit); for(int i=1;i<=8;i++){ for(int j=1;j<=8;j++){ if(count[i][j]>=2){ counter++; } } } if(counter > 0){ printf("Case #%d: YES\n",t); } else if (counter == 0) { printf("Case #%d: NO\n",t); } counter=0; } return 0; }
问题是:有2匹马,白色和黑色,它们的运动方式像普通象棋中的马一样。我们的目标是找出黑白马是否可以相遇(具有相同的...
[在进行下一个递归调用时没有更新limit_black
limit_white
。
moveblack(black_x+1,black_y+2,limitblack,map,limit);
//....