、#include <stdio.h> #define N 6 int board[N][N]; void printBoard() { int i, j; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { printf("%d ", board[i][j]); } printf("\n"); } printf("\n"); } int isValid(int row, int col) { int i, j; for (i = 0; i < row; i++) { if (board[i][col]) { return 0; } } for (i = row, j = col; i >= 0 && j >= 0; i--, j--) { if (board[i][j]) { return 0; } } for (i = row, j = col; i >= 0 && j < N; i--, j++) { if (board[i][j]) { return 0; } } return 1; } void solve(int row) { int i, j; if (row == N) { printBoard(); return; } for (i = 0; i < N; i++) { if (isValid(row, i)) { board[row][i] = 1; solve(row + 1); board[row][i] = 0; // 回溯 } } } int main() { solve(0); return 0; }设计算法说明
时间: 2024-04-07 11:29:47 浏览: 180
这是经典的 N 皇后问题,目标是在一个 N x N 的棋盘上放置 N 个皇后,使得它们互相不能攻击到。皇后可以攻击同一行、同一列、同一条对角线上的其他棋子。
该算法使用回溯法来解决 N 皇后问题。具体来说,从第一行开始,逐行尝试将皇后放置在每一列中。对于每一次尝试,在当前行和列的位置上放置皇后,如果放置后不冲突,则继续递归到下一行。如果无法放置皇后,则回溯到上一行,重新尝试在其他列中放置皇后。当放置完最后一行的皇后后,即找到一组解。
其中,isValid 函数用来判断当前位置是否可以放置皇后。它通过检查当前列、当前左上方和当前右上方是否已经有皇后来判断。
solve 函数是核心函数,它递归地尝试放置皇后,并在找到一组解后打印出来。如果无法放置皇后,则回溯到上一行。
printBoard 函数用于在控制台上打印棋盘。
相关问题
#include "hal_defs.h" #include "hal_cc8051.h" #include "hal_int.h" #include "hal_mcu.h" #include "hal_board.h" #include "hal_led.h" #include "hal_rf.h" #include "basic_rf.h" #include "hal_uart.h" #include <stdio.h> #include <string.h> #include <stdarg.h> /*****点对点通讯地址设置******/ #define RF_CHANNEL 23 // 频道 11~26 #define PAN_ID 0xAA22 //网络id #define MY_ADDR 0xAAAA //本机模块地址 #define SEND_ADDR 0xBBBB //发送地址 #define LED1 P1_0 #define LED2 P1_1 /**************************************************/ static basicRfCfg_t basicRfConfig; // 无线RF初始化 void ConfigRf_Init(void) { basicRfConfig.panId = PAN_ID; basicRfConfig.channel = RF_CHANNEL; basicRfConfig.myAddr = MY_ADDR; basicRfConfig.ackRequest = TRUE; while(basicRfInit(&basicRfConfig) == FAILED); basicRfReceiveOn(); } void initIO(void) { P1SEL &=~0x03; P1DIR |=0x03; LED1=1; LED2=1; } float getTemperature(void) { signed short int value; ADCCON3=(0x3E); ADCCON1 |=0x30; ADCCON1 |=0x40; while(!(ADCCON1 & 0x80)); value |=((int)ADCH<<6); if(value<0) value=0; return value*0.06229-311.43; } void getTemperature1(void) { char z; float avgTemp; unsigned char output[]=""; while(1) { LED1=1; avgTemp=getTemperature(); for(z=0;z<64;z++) { avgTemp +=getTemperature(); avgTemp=avgTemp/2; } output[0]=(unsigned char)(avgTemp)/10 + 48; output[1]=(unsigned char)(avgTemp)%10 + 48; output[2]='\0'; } } /********************MAIN************************/ void main(void) { halBoardInit();//选手不得在此函数内添加代码 ConfigRf_Init();//选手不得在此函数内添加代码 initIO(); uint8 a[128],c[128],len,output; while(1) { /* user code start */ len=halUartRxLen(); if(len>=2) { a[0]=len; halUartRead(&a[1],len); basicRfSendPacket(SEND_ADDR,a,len+1); } if(basicRfPacketIsReady()) { basicRfReceive(c,128,NULL); halUartWrite(&c[1],c[0]); if(c[1]==0xaa) { if(c[2]==0x01) { LED1=~LED1; LED2=LED2; } else if(c[2]==0x02) { LED2=~LED2; LED1=LED1; } else if(c[2]==0x03) { getTemperature1(); UART0SendString(output); UART0SendString("℃\t\r\n"); LED1=0; delay(2000); } { } } } /* user code end */ } }
这段代码存在一些问题:
1. 在函数 `getTemperature1()` 中,无限循环导致后面的代码无法运行。
2. 在函数 `getTemperature1()` 中,将浮点数转换为字符串的代码是错误的,应该使用 `sprintf` 函数。
3. 在函数 `main()` 中,变量 `output` 没有被初始化,导致在调用 `UART0SendString` 函数时会出现错误。
4. 在函数 `main()` 中,存在一个多余的空代码块。
5. 在函数 `main()` 中,调用了 `delay` 函数,但是该函数的声明和实现都没有给出,需要添加。
6. 在函数 `main()` 中,对变量 `len` 的使用可能会出现错误,因为 `halUartRxLen` 函数返回的是 `uint16` 类型,而 `len` 的类型是 `uint8`。
7. 在函数 `main()` 中,调用 `halUartRead` 函数时,第三个参数应该是 `len` 而不是 `len+1`。
8. 在函数 `main()` 中,调用 `UART0SendString` 函数时,应该将要发送的字符串作为参数传入,而不是将未初始化的变量 `output` 作为参数传入。
9. 在函数 `main()` 中,没有对变量 `a`、`c`、`len`、`output` 进行初始化,需要在主函数开头进行初始化。
10. 函数调用之间的空格和缩进不一致,需要进行统一。
下面是修改后的代码:
检查错误#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #include<stdio.h> #include"game.c" //测试三子棋游戏 void menu() { printf("***********************\n"); printf("****1.plat 0.exit*****\n"); printf("***********************\n"); } //游戏的整个实现 void game() { //数组-存放走出的棋盘信息 char board[ROW][COL] = {0}; //初始话棋盘 InitBoard(board,ROW,COL); //打印棋盘 DisplayBoard(board,ROW,COL); } void test() { int input = 0; do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: printf("三子棋\n"); game(); break; case 0: printf("退出游戏\n"); default: printf("选择错误,请重新选择!\n"); break; } } while (input); } int main() { test(); }
这段代码是一个简单的三子棋游戏的实现。在 `main` 函数中,它会调用 `test` 函数来展示游戏菜单,并根据用户的选择来执行相应的操作。在 `test` 函数中,它会循环展示菜单,接收用户的选择,并根据选择来执行相应的操作。当用户选择 1 时,会调用 `game` 函数开始游戏;当用户选择 0 时,会退出游戏。
在 `game` 函数中,它先声明了一个二维字符数组 `board` 来存放棋盘信息,并调用 `InitBoard` 函数初始化棋盘。然后调用 `DisplayBoard` 函数来显示当前棋盘状态。
这段代码看起来没有明显的错误,但请确保你已经包含了正确的头文件和源文件,并且没有其他错误导致程序无法编译或运行。如果你遇到了错误,请提供错误信息或者具体描述问题的方式,我将尽力帮助你解决问题。
阅读全文