二.接着是棋盘问题。还是深搜,感觉很简单,但是做起来就犯晕,不知道怎么简化。后来分成行和列慢慢处理。。
然后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了俩题。。。。也很是无奈。。。。然后今天还蛮开心的。
知道自己好多好多不会不懂,那就好好学,感觉又找回了高中的状态。
我觉得收获的更多的是一种自学能力,或者是不撞南墙不回头的精神。
写写博客发发牢骚也还不错,我觉得我的博客啰嗦的很,没有很大的学习的价值,因为很多东西还有一层薄纱笼罩。
明天又是新的开始,明天补题~