常见算法思想(回溯、分治、动态规划)

文章目录

回溯

八皇后问题

#include <iostream>
#include <stdio.h>
#include <string.h>

#ifndef ALGO_8QUEEN_H_
#define ALGO_8QUEEN_H_

namespace alg {
	class Queen8
	{
	private:
		char board[8][8];
		int cnt;

	public:
		void solve(){
			memset(board, '0', sizeof(board));
			cnt = 0;
			_solve(0);
		}
	private:
		void _solve(int row){
			int i;
			for(i=0; i<8; i++){
				board[row][i] = '1';
				if(check(row, i)){
					if(row == 7) 
						print();
					else
						_solve(row+1);
				}
				board[row][i] = '0';
			}
		}

		void print(){
			printf("chessboard: %d\n", ++cnt);
			int i, j;
			for(i=0; i<8; i++){
				for(j=0; j<8; j++){
					printf("%c ", board[i][j]);
				}
				printf("\n");
			}
		}

		bool check(int row, int col){
			int i, j;
			for(i=0; i<row; i++){
				if(board[i][col] == '1'){
					return false;
				}
			}

			i = row - 1, j = col - 1;
			while(i>=0 && j >=0){
				if(board[i][j] == '1'){
					return false;
				}
				i--;
				j--;
			}

			i = row - 1;
			j = col + 1;
			while(i>=0 && j<8){
				if(board[i][j] == '1'){
					return false;
				}
				i--;
				j++;
			}

			return true;
		}
	};
}

#endif



int main(int argc, char const *argv[])
{
	alg::Queen8 q;
	q.solve();

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值