hdu2553解题报告

来源:互联网 发布:武汉广电网络客服电话 编辑:程序博客网 时间:2024/06/06 02:31

经典的dfs:N皇后,开始看了刘汝佳前辈的书..代码简单明了...就是理解起来有点....哎哎...于是就自己用dfs模板加了一个判断,还有就是这里用到打表...对于N<=10 我们可以把N从1~10的情况都dfs出来存在一个数组,后面就直接取用,如果对于每一次输入dfs就会超时....

因为是逐行填写,,那么就只要考虑下图的三个方向(红的的)


上马:

#include<stdio.h>#include<string.h>int N;int ans;int map[14][14];int vis[3][2]={{-1,1},{-1,0},{-1,-1}};//这里是判断要用到的,对于这个位置的左右对角,和这一列看有没有填写过bool judg(int x,int y){for(int i=0;i<3;i++)//因为这里是逐行填写,就不用考虑这一行有没有出现,只要考虑三个方向{int a=x+vis[i][0],b=y+vis[i][1];while(!map[a][b]){a+=vis[i][0];b+=vis[i][1];}if(a>=0&&b>=0&&b<N)return false;}return true;}void dfs(int step){int i;if(step==N){ans++;return;}for(i=0;i<N;i++)//这里是从0到N行是否可以填数{if(!map[step][i] && judg(step,i))//进行3个方向判断有没有填写过{map[step][i]=1;dfs(step+1);map[step][i]=0;}}}int main(){int q[11];for(N=1;N<11;N++){   memset(map,0,sizeof(map));   ans=0;   dfs(0);   q[N]=ans;}while(scanf("%d",&N),N){printf("%d\n",q[N]);}return 0;}
个人愚昧观点...欢迎指正与讨论

原创粉丝点击