AI--N Queens Problem(Look-Back method)


#include <cstdio>//the biggest N of this call-back method is 28(8s)
#include <iostream>
#include <algorithm>
using namespace std;
int col[30];//col[row] seems the col of queen in the row
bool check(int r,int c)
{
    int i;
    for(i=1;i<r;i++)//make sure all the previous points are not conflict with the current one
        if(c==col[i]||(r-i)==abs(c-col[i]))//the cols and diagonal lines
            return false;
    return true;
}
//I didn't use the optimizing method(fetch the place that costs less squares on the diagonals) mentioned in the class,cause I think it's inconvenient(must use the queue and pointers).
//and by drawing some griddings,I noticed that the places that's more close to the border indeed cost less diagonal squares than those in the center.
//if I want to get the diagonal costing number,for (i,j), sum=min(j,n-i)+min(n-j,n-i);the former is those on left and the latter is on right.and i,j is from 1 to n.
int main()
{
    int n;
    cin>>n;
    int i=1,j;
    for(j=1;j<=n;j++)
        col[j]=0;//queens haven't been set yet
    while(1)
    {
        if(i==0)//while the col[1](the col of the queen in the 1st row) is more than n,in other words,all the ways have been tried
        {
            printf("end\n");
            return 0;
        }
        col[i]++;
        while(!check(i,col[i])&&col[i]<=n)
            col[i]++;//if the col is not suitable,then shift
        if(col[i]>n)
        {
            col[i]=0;//clear the current state
            i--;//look back the previous row
            continue;
        }
        if(i==n)//all the queens have been set
        {
            for(j=1;j<=n;j++)
                printf("(%d,%d) ",j,col[j]);
            cout<<endl;
            return 0;//if a way is found,return immediately
            //i=0;//if you want to find all the ways...
        }
        i++;
    }
    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值