网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月08日漏签0天
c语言吧 关注:801,756贴子:4,374,796
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 16回复贴,共1页
<<返回c语言吧
>0< 加载中...

代码求优化

  • 只看楼主
  • 收藏

  • 回复
  • milk192735
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
题目大概是:中国象棋棋盘(10×9)上有一只马和另外一个棋子,输入马和这颗棋子的坐标,输出马能够跳到的所有位置(先行后列,升序输出),要考虑马脚被绊住和马跳出棋盘的情况
然后我的代码可能是对的,但是有点不满意,希望有人帮忙优化
#include <stdio.h>
#include <stdlib.h>
#define DIRECTIONS 4
#define SITUATIONS 2
#define ROWS 10
#define COLS 9
int dlocation[DIRECTIONS][SITUATIONS][2] = {{{-2, -1}, {-2, 1}},
{{-1, 2}, {1, 2}},
{{2, 1}, {2, -1}},
{{1, -2}, {-1, -2}}}; //dlocation记录往每个方向走的2种情况下x、y分别的变化量
struct location{
int row;
int col;
}; //记录x和y坐标
int cal_direct(struct location horse, struct location obstacle); //用于计算哪个方向上马脚会被绊住,若无则返回-1
int board[ROWS + 1][COLS + 1];
int main(void) {
struct location horse, obstacle;
scanf("%d %d", &horse.row, &horse.col);
scanf("%d %d", &obstacle.row, &obstacle.col);
int direction = cal_direct(horse, obstacle);
for (int direct = 0; direct < DIRECTIONS; ++direct) { //遍历4个方向
if (direct != direction) { //如果该方向上马脚未被绊住
for (int situation = 0; situation < SITUATIONS; ++situation) { //遍历每个方向上的两种可能
int new_row = horse.row+ dlocation[direct][situation][0];
int new_col = horse.col+ dlocation[direct][situation][1];
if (new_row >= 1 && new_row <= ROWS && new_col >= 1 && new_col <= COLS) {
board[new_row][new_col] = 1;
}
}
}
}
for (int i = 1; i <= ROWS; ++i) {
for (int j = 1; j <= COLS; ++j) {
if (board[i][j]) {
printf("%d %d\n", i, j); //输出
}
}
}
return 0;
}
int cal_direct(struct location horse, struct location obstacle) {
int direction = -1; //direction为马脚被绊住的方向,默认-1
int x = horse.row- obstacle.row;
int y = horse.col- obstacle.col;
if (abs(x) + abs(y) == 1) { //计算曼哈顿距离,若为1则马脚会被绊住
direction = !y * (x + 1) + !x * (y + 2); //有点抽象,总之会让(-1, 0), (0, 1), (1, 0), (0, -1)分别返回(0, 1, 2, 3)
}
return direction;
}


  • 丶仰望丶
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
只跳一下? location直接2维数组 8种跳法就够了吧。可以把另外棋子和马的坐标相减判断另外一个棋子在马的哪个方向和距离,其他方向的的就不用考虑是否绊住了。其他没啥好优化的


2026-01-08 22:16:06
广告
不感兴趣
开通SVIP免广告
  • crazybobo1207
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
if(绊马脚位置为空 && 目标位置在棋盘之内且为空 ),则目标位置是一个可行的位置。
硬着写8条这种语句,语句里面全都是当前x,y坐标的加1加2减1减2表达式,简单粗暴就当把循环展开了


  • Jeffery_z
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
BFS+队列,最方便的


  • Waaaaf
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没有性能问题不必优化,况且这种小规模的数据完全可以遍历所有情况,然后生成编译期建表的代码,用不着什么复杂的算法。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 16回复贴,共1页
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示