2017.8.1(2)————深搜

来源:互联网 发布:mini mac恢复出厂设置 编辑:程序博客网 时间:2024/06/05 06:09

二.接着是棋盘问题。还是深搜,感觉很简单,但是做起来就犯晕,不知道怎么简化。后来分成行和列慢慢处理。。

然后i++和i+1区别大了去了,我也因此受教了,折腾了一天吧,一直找不出哪里错了。。。。

大致意思是n*n的一个棋盘,含有#号的地方是可以放置物品的,k表示要放置的物品数,要求不能同一行同一列。。。

从每一行开始讨论。假设这一行放物品。。

 

#include<iostream>
#include<string.h>
using namespace std;
char chess[10][10];
void dfs(int);
int nownum;
int fangan;
int lieshu[10];
int k,n;
void dfs(int i)
{
    if(nownum==k)
    {
        fangan++;
        return;
    }
    if(i>=n)
    return ;
        for(int j=0;j<n;j++)
        {
            if(chess[i][j]=='#'&&lieshu[j]==0)
            {
                lieshu[j]=1;
                nownum++;
                dfs(i+1);//与下面的区别就是这一行房还是不放物品
                lieshu[j]=0;
                nownum--;
            }
        }
        dfs(i+1);//这一行不放物品的话(我之前写成了的dfs(i++)把i的值给变了,影响了接下来的chess[i][j])这个点很重要
}

int main()
{
    while(cin>>n>>k)
    {
        if(n==-1 && k==-1)
            break;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
                cin>>chess[i][j];
        }
        memset(lieshu,0,sizeof(lieshu));
        fangan=0;
        nownum=0;
        dfs(0);
        cout<<fangan<<endl;
    }
    return 0;

}

这道题挺好的,考察对深搜的理解,细节的掌握。

三.练习赛

前二十分钟大体看了看题目。。找了个题目短小精悍以理解的做了做,发现着实简单不由得开心起来,就是第二题。。。

好吧,第一次WA之后,我又读了读,发现英文还真是逗人,一个守卫就守着一扇门,等人完全进去后才走。比如ABCDA那么第一个A守卫是最后走喽。然后我理解的就与他有些偏差了。然后很无奈,一直在想解决办法。然后。。。时间停了。给我的感觉是还没开始就已结束。

今天还没有补题,那些题目还没看。。。晚上回去看,想一想,最后再看题解。

我现在也不知道自己的代码哪错了。第五组就不行了。

四。个人感想

不大关心名次的我只知道知识一定要弄懂弄透,速度还是很慢,但今天感觉效率比昨天高了,也或许是错觉。

一周已过去两天,我就A了俩题。。。。也很是无奈。。。。然后今天还蛮开心的。

知道自己好多好多不会不懂,那就好好学,感觉又找回了高中的状态。

我觉得收获的更多的是一种自学能力,或者是不撞南墙不回头的精神。

写写博客发发牢骚也还不错,我觉得我的博客啰嗦的很,没有很大的学习的价值,因为很多东西还有一层薄纱笼罩。

明天又是新的开始,明天补题~